linux/drivers/media/usb/cx231xx/cx231xx-cards.c
<<
>>
Prefs
   1/*
   2   cx231xx-cards.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 "cx231xx.h"
  24#include <linux/init.h>
  25#include <linux/module.h>
  26#include <linux/slab.h>
  27#include <linux/delay.h>
  28#include <linux/i2c.h>
  29#include <media/tuner.h>
  30#include <media/tveeprom.h>
  31#include <media/v4l2-common.h>
  32
  33#include <media/drv-intf/cx25840.h>
  34#include <media/dvb-usb-ids.h>
  35#include "xc5000.h"
  36#include "tda18271.h"
  37
  38
  39static int tuner = -1;
  40module_param(tuner, int, 0444);
  41MODULE_PARM_DESC(tuner, "tuner type");
  42
  43static int transfer_mode = 1;
  44module_param(transfer_mode, int, 0444);
  45MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");
  46
  47static unsigned int disable_ir;
  48module_param(disable_ir, int, 0444);
  49MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
  50
  51/* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
  52static unsigned long cx231xx_devused;
  53
  54/*
  55 *  Reset sequences for analog/digital modes
  56 */
  57
  58static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
  59        {0x03, 0x01, 10},
  60        {0x03, 0x00, 30},
  61        {0x03, 0x01, 10},
  62        {-1, -1, -1},
  63};
  64
  65/*
  66 *  Board definitions
  67 */
  68struct cx231xx_board cx231xx_boards[] = {
  69        [CX231XX_BOARD_UNKNOWN] = {
  70                .name = "Unknown CX231xx video grabber",
  71                .tuner_type = TUNER_ABSENT,
  72                .input = {{
  73                                .type = CX231XX_VMUX_TELEVISION,
  74                                .vmux = CX231XX_VIN_3_1,
  75                                .amux = CX231XX_AMUX_VIDEO,
  76                                .gpio = NULL,
  77                        }, {
  78                                .type = CX231XX_VMUX_COMPOSITE1,
  79                                .vmux = CX231XX_VIN_2_1,
  80                                .amux = CX231XX_AMUX_LINE_IN,
  81                                .gpio = NULL,
  82                        }, {
  83                                .type = CX231XX_VMUX_SVIDEO,
  84                                .vmux = CX231XX_VIN_1_1 |
  85                                        (CX231XX_VIN_1_2 << 8) |
  86                                        CX25840_SVIDEO_ON,
  87                                .amux = CX231XX_AMUX_LINE_IN,
  88                                .gpio = NULL,
  89                        }
  90                },
  91        },
  92        [CX231XX_BOARD_CNXT_CARRAERA] = {
  93                .name = "Conexant Hybrid TV - CARRAERA",
  94                .tuner_type = TUNER_XC5000,
  95                .tuner_addr = 0x61,
  96                .tuner_gpio = RDE250_XCV_TUNER,
  97                .tuner_sif_gpio = 0x05,
  98                .tuner_scl_gpio = 0x1a,
  99                .tuner_sda_gpio = 0x1b,
 100                .decoder = CX231XX_AVDECODER,
 101                .output_mode = OUT_MODE_VIP11,
 102                .demod_xfer_mode = 0,
 103                .ctl_pin_status_mask = 0xFFFFFFC4,
 104                .agc_analog_digital_select_gpio = 0x0c,
 105                .gpio_pin_status_mask = 0x4001000,
 106                .tuner_i2c_master = I2C_1_MUX_3,
 107                .demod_i2c_master = I2C_2,
 108                .has_dvb = 1,
 109                .demod_addr = 0x02,
 110                .norm = V4L2_STD_PAL,
 111
 112                .input = {{
 113                                .type = CX231XX_VMUX_TELEVISION,
 114                                .vmux = CX231XX_VIN_3_1,
 115                                .amux = CX231XX_AMUX_VIDEO,
 116                                .gpio = NULL,
 117                        }, {
 118                                .type = CX231XX_VMUX_COMPOSITE1,
 119                                .vmux = CX231XX_VIN_2_1,
 120                                .amux = CX231XX_AMUX_LINE_IN,
 121                                .gpio = NULL,
 122                        }, {
 123                                .type = CX231XX_VMUX_SVIDEO,
 124                                .vmux = CX231XX_VIN_1_1 |
 125                                        (CX231XX_VIN_1_2 << 8) |
 126                                        CX25840_SVIDEO_ON,
 127                                .amux = CX231XX_AMUX_LINE_IN,
 128                                .gpio = NULL,
 129                        }
 130                },
 131        },
 132        [CX231XX_BOARD_CNXT_SHELBY] = {
 133                .name = "Conexant Hybrid TV - SHELBY",
 134                .tuner_type = TUNER_XC5000,
 135                .tuner_addr = 0x61,
 136                .tuner_gpio = RDE250_XCV_TUNER,
 137                .tuner_sif_gpio = 0x05,
 138                .tuner_scl_gpio = 0x1a,
 139                .tuner_sda_gpio = 0x1b,
 140                .decoder = CX231XX_AVDECODER,
 141                .output_mode = OUT_MODE_VIP11,
 142                .demod_xfer_mode = 0,
 143                .ctl_pin_status_mask = 0xFFFFFFC4,
 144                .agc_analog_digital_select_gpio = 0x0c,
 145                .gpio_pin_status_mask = 0x4001000,
 146                .tuner_i2c_master = I2C_1_MUX_3,
 147                .demod_i2c_master = I2C_2,
 148                .has_dvb = 1,
 149                .demod_addr = 0x32,
 150                .norm = V4L2_STD_NTSC,
 151
 152                .input = {{
 153                                .type = CX231XX_VMUX_TELEVISION,
 154                                .vmux = CX231XX_VIN_3_1,
 155                                .amux = CX231XX_AMUX_VIDEO,
 156                                .gpio = NULL,
 157                        }, {
 158                                .type = CX231XX_VMUX_COMPOSITE1,
 159                                .vmux = CX231XX_VIN_2_1,
 160                                .amux = CX231XX_AMUX_LINE_IN,
 161                                .gpio = NULL,
 162                        }, {
 163                                .type = CX231XX_VMUX_SVIDEO,
 164                                .vmux = CX231XX_VIN_1_1 |
 165                                        (CX231XX_VIN_1_2 << 8) |
 166                                        CX25840_SVIDEO_ON,
 167                                .amux = CX231XX_AMUX_LINE_IN,
 168                                .gpio = NULL,
 169                        }
 170                },
 171        },
 172        [CX231XX_BOARD_CNXT_RDE_253S] = {
 173                .name = "Conexant Hybrid TV - RDE253S",
 174                .tuner_type = TUNER_NXP_TDA18271,
 175                .tuner_addr = 0x60,
 176                .tuner_gpio = RDE250_XCV_TUNER,
 177                .tuner_sif_gpio = 0x05,
 178                .tuner_scl_gpio = 0x1a,
 179                .tuner_sda_gpio = 0x1b,
 180                .decoder = CX231XX_AVDECODER,
 181                .output_mode = OUT_MODE_VIP11,
 182                .demod_xfer_mode = 0,
 183                .ctl_pin_status_mask = 0xFFFFFFC4,
 184                .agc_analog_digital_select_gpio = 0x1c,
 185                .gpio_pin_status_mask = 0x4001000,
 186                .tuner_i2c_master = I2C_1_MUX_3,
 187                .demod_i2c_master = I2C_2,
 188                .has_dvb = 1,
 189                .demod_addr = 0x02,
 190                .norm = V4L2_STD_PAL,
 191
 192                .input = {{
 193                                .type = CX231XX_VMUX_TELEVISION,
 194                                .vmux = CX231XX_VIN_3_1,
 195                                .amux = CX231XX_AMUX_VIDEO,
 196                                .gpio = NULL,
 197                        }, {
 198                                .type = CX231XX_VMUX_COMPOSITE1,
 199                                .vmux = CX231XX_VIN_2_1,
 200                                .amux = CX231XX_AMUX_LINE_IN,
 201                                .gpio = NULL,
 202                        }, {
 203                                .type = CX231XX_VMUX_SVIDEO,
 204                                .vmux = CX231XX_VIN_1_1 |
 205                                        (CX231XX_VIN_1_2 << 8) |
 206                                        CX25840_SVIDEO_ON,
 207                                .amux = CX231XX_AMUX_LINE_IN,
 208                                .gpio = NULL,
 209                        }
 210                },
 211        },
 212
 213        [CX231XX_BOARD_CNXT_RDU_253S] = {
 214                .name = "Conexant Hybrid TV - RDU253S",
 215                .tuner_type = TUNER_NXP_TDA18271,
 216                .tuner_addr = 0x60,
 217                .tuner_gpio = RDE250_XCV_TUNER,
 218                .tuner_sif_gpio = 0x05,
 219                .tuner_scl_gpio = 0x1a,
 220                .tuner_sda_gpio = 0x1b,
 221                .decoder = CX231XX_AVDECODER,
 222                .output_mode = OUT_MODE_VIP11,
 223                .demod_xfer_mode = 0,
 224                .ctl_pin_status_mask = 0xFFFFFFC4,
 225                .agc_analog_digital_select_gpio = 0x1c,
 226                .gpio_pin_status_mask = 0x4001000,
 227                .tuner_i2c_master = I2C_1_MUX_3,
 228                .demod_i2c_master = I2C_2,
 229                .has_dvb = 1,
 230                .demod_addr = 0x02,
 231                .norm = V4L2_STD_PAL,
 232
 233                .input = {{
 234                                .type = CX231XX_VMUX_TELEVISION,
 235                                .vmux = CX231XX_VIN_3_1,
 236                                .amux = CX231XX_AMUX_VIDEO,
 237                                .gpio = NULL,
 238                        }, {
 239                                .type = CX231XX_VMUX_COMPOSITE1,
 240                                .vmux = CX231XX_VIN_2_1,
 241                                .amux = CX231XX_AMUX_LINE_IN,
 242                                .gpio = NULL,
 243                        }, {
 244                                .type = CX231XX_VMUX_SVIDEO,
 245                                .vmux = CX231XX_VIN_1_1 |
 246                                        (CX231XX_VIN_1_2 << 8) |
 247                                        CX25840_SVIDEO_ON,
 248                                .amux = CX231XX_AMUX_LINE_IN,
 249                                .gpio = NULL,
 250                        }
 251                },
 252        },
 253        [CX231XX_BOARD_CNXT_VIDEO_GRABBER] = {
 254                .name = "Conexant VIDEO GRABBER",
 255                .tuner_type = TUNER_ABSENT,
 256                .decoder = CX231XX_AVDECODER,
 257                .output_mode = OUT_MODE_VIP11,
 258                .ctl_pin_status_mask = 0xFFFFFFC4,
 259                .agc_analog_digital_select_gpio = 0x1c,
 260                .gpio_pin_status_mask = 0x4001000,
 261                .norm = V4L2_STD_PAL,
 262                .no_alt_vanc = 1,
 263                .external_av = 1,
 264                /* Actually, it has a 417, but it isn't working correctly.
 265                 * So set to 0 for now until someone can manage to get this
 266                 * to work reliably. */
 267                .has_417 = 0,
 268
 269                .input = {{
 270                                .type = CX231XX_VMUX_COMPOSITE1,
 271                                .vmux = CX231XX_VIN_2_1,
 272                                .amux = CX231XX_AMUX_LINE_IN,
 273                                .gpio = NULL,
 274                        }, {
 275                                .type = CX231XX_VMUX_SVIDEO,
 276                                .vmux = CX231XX_VIN_1_1 |
 277                                        (CX231XX_VIN_1_2 << 8) |
 278                                        CX25840_SVIDEO_ON,
 279                                .amux = CX231XX_AMUX_LINE_IN,
 280                                .gpio = NULL,
 281                        }
 282                },
 283        },
 284        [CX231XX_BOARD_CNXT_RDE_250] = {
 285                .name = "Conexant Hybrid TV - rde 250",
 286                .tuner_type = TUNER_XC5000,
 287                .tuner_addr = 0x61,
 288                .tuner_gpio = RDE250_XCV_TUNER,
 289                .tuner_sif_gpio = 0x05,
 290                .tuner_scl_gpio = 0x1a,
 291                .tuner_sda_gpio = 0x1b,
 292                .decoder = CX231XX_AVDECODER,
 293                .output_mode = OUT_MODE_VIP11,
 294                .demod_xfer_mode = 0,
 295                .ctl_pin_status_mask = 0xFFFFFFC4,
 296                .agc_analog_digital_select_gpio = 0x0c,
 297                .gpio_pin_status_mask = 0x4001000,
 298                .tuner_i2c_master = I2C_1_MUX_3,
 299                .demod_i2c_master = I2C_2,
 300                .has_dvb = 1,
 301                .demod_addr = 0x02,
 302                .norm = V4L2_STD_PAL,
 303
 304                .input = {{
 305                                .type = CX231XX_VMUX_TELEVISION,
 306                                .vmux = CX231XX_VIN_2_1,
 307                                .amux = CX231XX_AMUX_VIDEO,
 308                                .gpio = NULL,
 309                        }
 310                },
 311        },
 312        [CX231XX_BOARD_CNXT_RDU_250] = {
 313                .name = "Conexant Hybrid TV - RDU 250",
 314                .tuner_type = TUNER_XC5000,
 315                .tuner_addr = 0x61,
 316                .tuner_gpio = RDE250_XCV_TUNER,
 317                .tuner_sif_gpio = 0x05,
 318                .tuner_scl_gpio = 0x1a,
 319                .tuner_sda_gpio = 0x1b,
 320                .decoder = CX231XX_AVDECODER,
 321                .output_mode = OUT_MODE_VIP11,
 322                .demod_xfer_mode = 0,
 323                .ctl_pin_status_mask = 0xFFFFFFC4,
 324                .agc_analog_digital_select_gpio = 0x0c,
 325                .gpio_pin_status_mask = 0x4001000,
 326                .tuner_i2c_master = I2C_1_MUX_3,
 327                .demod_i2c_master = I2C_2,
 328                .has_dvb = 1,
 329                .demod_addr = 0x32,
 330                .norm = V4L2_STD_NTSC,
 331
 332                .input = {{
 333                                .type = CX231XX_VMUX_TELEVISION,
 334                                .vmux = CX231XX_VIN_2_1,
 335                                .amux = CX231XX_AMUX_VIDEO,
 336                                .gpio = NULL,
 337                        }
 338                },
 339        },
 340        [CX231XX_BOARD_HAUPPAUGE_EXETER] = {
 341                .name = "Hauppauge EXETER",
 342                .tuner_type = TUNER_NXP_TDA18271,
 343                .tuner_addr = 0x60,
 344                .tuner_gpio = RDE250_XCV_TUNER,
 345                .tuner_sif_gpio = 0x05,
 346                .tuner_scl_gpio = 0x1a,
 347                .tuner_sda_gpio = 0x1b,
 348                .decoder = CX231XX_AVDECODER,
 349                .output_mode = OUT_MODE_VIP11,
 350                .demod_xfer_mode = 0,
 351                .ctl_pin_status_mask = 0xFFFFFFC4,
 352                .agc_analog_digital_select_gpio = 0x0c,
 353                .gpio_pin_status_mask = 0x4001000,
 354                .tuner_i2c_master = I2C_1_MUX_1,
 355                .demod_i2c_master = I2C_1_MUX_1,
 356                .has_dvb = 1,
 357                .demod_addr = 0x0e,
 358                .norm = V4L2_STD_NTSC,
 359
 360                .input = {{
 361                        .type = CX231XX_VMUX_TELEVISION,
 362                        .vmux = CX231XX_VIN_3_1,
 363                        .amux = CX231XX_AMUX_VIDEO,
 364                        .gpio = NULL,
 365                }, {
 366                        .type = CX231XX_VMUX_COMPOSITE1,
 367                        .vmux = CX231XX_VIN_2_1,
 368                        .amux = CX231XX_AMUX_LINE_IN,
 369                        .gpio = NULL,
 370                }, {
 371                        .type = CX231XX_VMUX_SVIDEO,
 372                        .vmux = CX231XX_VIN_1_1 |
 373                                (CX231XX_VIN_1_2 << 8) |
 374                                CX25840_SVIDEO_ON,
 375                        .amux = CX231XX_AMUX_LINE_IN,
 376                        .gpio = NULL,
 377                } },
 378        },
 379        [CX231XX_BOARD_HAUPPAUGE_USBLIVE2] = {
 380                .name = "Hauppauge USB Live 2",
 381                .tuner_type = TUNER_ABSENT,
 382                .decoder = CX231XX_AVDECODER,
 383                .output_mode = OUT_MODE_VIP11,
 384                .demod_xfer_mode = 0,
 385                .ctl_pin_status_mask = 0xFFFFFFC4,
 386                .agc_analog_digital_select_gpio = 0x0c,
 387                .gpio_pin_status_mask = 0x4001000,
 388                .norm = V4L2_STD_NTSC,
 389                .no_alt_vanc = 1,
 390                .external_av = 1,
 391                .input = {{
 392                        .type = CX231XX_VMUX_COMPOSITE1,
 393                        .vmux = CX231XX_VIN_2_1,
 394                        .amux = CX231XX_AMUX_LINE_IN,
 395                        .gpio = NULL,
 396                }, {
 397                        .type = CX231XX_VMUX_SVIDEO,
 398                        .vmux = CX231XX_VIN_1_1 |
 399                                (CX231XX_VIN_1_2 << 8) |
 400                                CX25840_SVIDEO_ON,
 401                        .amux = CX231XX_AMUX_LINE_IN,
 402                        .gpio = NULL,
 403                } },
 404        },
 405        [CX231XX_BOARD_KWORLD_UB430_USB_HYBRID] = {
 406                .name = "Kworld UB430 USB Hybrid",
 407                .tuner_type = TUNER_NXP_TDA18271,
 408                .tuner_addr = 0x60,
 409                .decoder = CX231XX_AVDECODER,
 410                .output_mode = OUT_MODE_VIP11,
 411                .demod_xfer_mode = 0,
 412                .ctl_pin_status_mask = 0xFFFFFFC4,
 413                .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
 414                .tuner_sif_gpio = -1,
 415                .tuner_scl_gpio = -1,
 416                .tuner_sda_gpio = -1,
 417                .gpio_pin_status_mask = 0x4001000,
 418                .tuner_i2c_master = I2C_2,
 419                .demod_i2c_master = I2C_1_MUX_3,
 420                .ir_i2c_master = I2C_2,
 421                .has_dvb = 1,
 422                .demod_addr = 0x10,
 423                .norm = V4L2_STD_PAL_M,
 424                .input = {{
 425                        .type = CX231XX_VMUX_TELEVISION,
 426                        .vmux = CX231XX_VIN_3_1,
 427                        .amux = CX231XX_AMUX_VIDEO,
 428                        .gpio = NULL,
 429                }, {
 430                        .type = CX231XX_VMUX_COMPOSITE1,
 431                        .vmux = CX231XX_VIN_2_1,
 432                        .amux = CX231XX_AMUX_LINE_IN,
 433                        .gpio = NULL,
 434                }, {
 435                        .type = CX231XX_VMUX_SVIDEO,
 436                        .vmux = CX231XX_VIN_1_1 |
 437                                (CX231XX_VIN_1_2 << 8) |
 438                                CX25840_SVIDEO_ON,
 439                        .amux = CX231XX_AMUX_LINE_IN,
 440                        .gpio = NULL,
 441                } },
 442        },
 443        [CX231XX_BOARD_KWORLD_UB445_USB_HYBRID] = {
 444                .name = "Kworld UB445 USB Hybrid",
 445                .tuner_type = TUNER_NXP_TDA18271,
 446                .tuner_addr = 0x60,
 447                .decoder = CX231XX_AVDECODER,
 448                .output_mode = OUT_MODE_VIP11,
 449                .demod_xfer_mode = 0,
 450                .ctl_pin_status_mask = 0xFFFFFFC4,
 451                .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
 452                .tuner_sif_gpio = -1,
 453                .tuner_scl_gpio = -1,
 454                .tuner_sda_gpio = -1,
 455                .gpio_pin_status_mask = 0x4001000,
 456                .tuner_i2c_master = I2C_2,
 457                .demod_i2c_master = I2C_1_MUX_3,
 458                .ir_i2c_master = I2C_2,
 459                .has_dvb = 1,
 460                .demod_addr = 0x10,
 461                .norm = V4L2_STD_NTSC_M,
 462                .input = {{
 463                        .type = CX231XX_VMUX_TELEVISION,
 464                        .vmux = CX231XX_VIN_3_1,
 465                        .amux = CX231XX_AMUX_VIDEO,
 466                        .gpio = NULL,
 467                }, {
 468                        .type = CX231XX_VMUX_COMPOSITE1,
 469                        .vmux = CX231XX_VIN_2_1,
 470                        .amux = CX231XX_AMUX_LINE_IN,
 471                        .gpio = NULL,
 472                }, {
 473                        .type = CX231XX_VMUX_SVIDEO,
 474                        .vmux = CX231XX_VIN_1_1 |
 475                                (CX231XX_VIN_1_2 << 8) |
 476                                CX25840_SVIDEO_ON,
 477                        .amux = CX231XX_AMUX_LINE_IN,
 478                        .gpio = NULL,
 479                } },
 480        },
 481        [CX231XX_BOARD_PV_PLAYTV_USB_HYBRID] = {
 482                .name = "Pixelview PlayTV USB Hybrid",
 483                .tuner_type = TUNER_NXP_TDA18271,
 484                .tuner_addr = 0x60,
 485                .decoder = CX231XX_AVDECODER,
 486                .output_mode = OUT_MODE_VIP11,
 487                .demod_xfer_mode = 0,
 488                .ctl_pin_status_mask = 0xFFFFFFC4,
 489                .agc_analog_digital_select_gpio = 0x1c,
 490                .tuner_sif_gpio = -1,
 491                .tuner_scl_gpio = -1,
 492                .tuner_sda_gpio = -1,
 493                .gpio_pin_status_mask = 0x4001000,
 494                .tuner_i2c_master = I2C_2,
 495                .demod_i2c_master = I2C_1_MUX_3,
 496                .ir_i2c_master = I2C_2,
 497                .rc_map_name = RC_MAP_PIXELVIEW_002T,
 498                .has_dvb = 1,
 499                .demod_addr = 0x10,
 500                .norm = V4L2_STD_PAL_M,
 501                .input = {{
 502                        .type = CX231XX_VMUX_TELEVISION,
 503                        .vmux = CX231XX_VIN_3_1,
 504                        .amux = CX231XX_AMUX_VIDEO,
 505                        .gpio = NULL,
 506                }, {
 507                        .type = CX231XX_VMUX_COMPOSITE1,
 508                        .vmux = CX231XX_VIN_2_1,
 509                        .amux = CX231XX_AMUX_LINE_IN,
 510                        .gpio = NULL,
 511                }, {
 512                        .type = CX231XX_VMUX_SVIDEO,
 513                        .vmux = CX231XX_VIN_1_1 |
 514                                (CX231XX_VIN_1_2 << 8) |
 515                                CX25840_SVIDEO_ON,
 516                        .amux = CX231XX_AMUX_LINE_IN,
 517                        .gpio = NULL,
 518                } },
 519        },
 520        [CX231XX_BOARD_PV_XCAPTURE_USB] = {
 521                .name = "Pixelview Xcapture USB",
 522                .tuner_type = TUNER_ABSENT,
 523                .decoder = CX231XX_AVDECODER,
 524                .output_mode = OUT_MODE_VIP11,
 525                .demod_xfer_mode = 0,
 526                .ctl_pin_status_mask = 0xFFFFFFC4,
 527                .agc_analog_digital_select_gpio = 0x0c,
 528                .gpio_pin_status_mask = 0x4001000,
 529                .norm = V4L2_STD_NTSC,
 530                .no_alt_vanc = 1,
 531                .external_av = 1,
 532
 533                .input = {{
 534                                .type = CX231XX_VMUX_COMPOSITE1,
 535                                .vmux = CX231XX_VIN_2_1,
 536                                .amux = CX231XX_AMUX_LINE_IN,
 537                                .gpio = NULL,
 538                        }, {
 539                                .type = CX231XX_VMUX_SVIDEO,
 540                                .vmux = CX231XX_VIN_1_1 |
 541                                        (CX231XX_VIN_1_2 << 8) |
 542                                        CX25840_SVIDEO_ON,
 543                                .amux = CX231XX_AMUX_LINE_IN,
 544                                .gpio = NULL,
 545                        }
 546                },
 547        },
 548
 549        [CX231XX_BOARD_ICONBIT_U100] = {
 550                .name = "Iconbit Analog Stick U100 FM",
 551                .tuner_type = TUNER_ABSENT,
 552                .decoder = CX231XX_AVDECODER,
 553                .output_mode = OUT_MODE_VIP11,
 554                .demod_xfer_mode = 0,
 555                .ctl_pin_status_mask = 0xFFFFFFC4,
 556                .agc_analog_digital_select_gpio = 0x1C,
 557                .gpio_pin_status_mask = 0x4001000,
 558
 559                .input = {{
 560                        .type = CX231XX_VMUX_COMPOSITE1,
 561                        .vmux = CX231XX_VIN_2_1,
 562                        .amux = CX231XX_AMUX_LINE_IN,
 563                        .gpio = NULL,
 564                }, {
 565                        .type = CX231XX_VMUX_SVIDEO,
 566                        .vmux = CX231XX_VIN_1_1 |
 567                                (CX231XX_VIN_1_2 << 8) |
 568                                CX25840_SVIDEO_ON,
 569                        .amux = CX231XX_AMUX_LINE_IN,
 570                        .gpio = NULL,
 571                } },
 572        },
 573        [CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL] = {
 574                .name = "Hauppauge WinTV USB2 FM (PAL)",
 575                .tuner_type = TUNER_NXP_TDA18271,
 576                .tuner_addr = 0x60,
 577                .tuner_gpio = RDE250_XCV_TUNER,
 578                .tuner_sif_gpio = 0x05,
 579                .tuner_scl_gpio = 0x1a,
 580                .tuner_sda_gpio = 0x1b,
 581                .decoder = CX231XX_AVDECODER,
 582                .output_mode = OUT_MODE_VIP11,
 583                .ctl_pin_status_mask = 0xFFFFFFC4,
 584                .agc_analog_digital_select_gpio = 0x0c,
 585                .gpio_pin_status_mask = 0x4001000,
 586                .tuner_i2c_master = I2C_1_MUX_3,
 587                .norm = V4L2_STD_PAL,
 588
 589                .input = {{
 590                        .type = CX231XX_VMUX_TELEVISION,
 591                        .vmux = CX231XX_VIN_3_1,
 592                        .amux = CX231XX_AMUX_VIDEO,
 593                        .gpio = NULL,
 594                }, {
 595                        .type = CX231XX_VMUX_COMPOSITE1,
 596                        .vmux = CX231XX_VIN_2_1,
 597                        .amux = CX231XX_AMUX_LINE_IN,
 598                        .gpio = NULL,
 599                }, {
 600                        .type = CX231XX_VMUX_SVIDEO,
 601                        .vmux = CX231XX_VIN_1_1 |
 602                                (CX231XX_VIN_1_2 << 8) |
 603                                CX25840_SVIDEO_ON,
 604                        .amux = CX231XX_AMUX_LINE_IN,
 605                        .gpio = NULL,
 606                } },
 607        },
 608        [CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC] = {
 609                .name = "Hauppauge WinTV USB2 FM (NTSC)",
 610                .tuner_type = TUNER_NXP_TDA18271,
 611                .tuner_addr = 0x60,
 612                .tuner_gpio = RDE250_XCV_TUNER,
 613                .tuner_sif_gpio = 0x05,
 614                .tuner_scl_gpio = 0x1a,
 615                .tuner_sda_gpio = 0x1b,
 616                .decoder = CX231XX_AVDECODER,
 617                .output_mode = OUT_MODE_VIP11,
 618                .ctl_pin_status_mask = 0xFFFFFFC4,
 619                .agc_analog_digital_select_gpio = 0x0c,
 620                .gpio_pin_status_mask = 0x4001000,
 621                .tuner_i2c_master = I2C_1_MUX_3,
 622                .norm = V4L2_STD_NTSC,
 623
 624                .input = {{
 625                        .type = CX231XX_VMUX_TELEVISION,
 626                        .vmux = CX231XX_VIN_3_1,
 627                        .amux = CX231XX_AMUX_VIDEO,
 628                        .gpio = NULL,
 629                }, {
 630                        .type = CX231XX_VMUX_COMPOSITE1,
 631                        .vmux = CX231XX_VIN_2_1,
 632                        .amux = CX231XX_AMUX_LINE_IN,
 633                        .gpio = NULL,
 634                }, {
 635                        .type = CX231XX_VMUX_SVIDEO,
 636                        .vmux = CX231XX_VIN_1_1 |
 637                                (CX231XX_VIN_1_2 << 8) |
 638                                CX25840_SVIDEO_ON,
 639                        .amux = CX231XX_AMUX_LINE_IN,
 640                        .gpio = NULL,
 641                } },
 642        },
 643        [CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2] = {
 644                .name = "Elgato Video Capture V2",
 645                .tuner_type = TUNER_ABSENT,
 646                .decoder = CX231XX_AVDECODER,
 647                .output_mode = OUT_MODE_VIP11,
 648                .demod_xfer_mode = 0,
 649                .ctl_pin_status_mask = 0xFFFFFFC4,
 650                .agc_analog_digital_select_gpio = 0x0c,
 651                .gpio_pin_status_mask = 0x4001000,
 652                .norm = V4L2_STD_NTSC,
 653                .no_alt_vanc = 1,
 654                .external_av = 1,
 655                .input = {{
 656                        .type = CX231XX_VMUX_COMPOSITE1,
 657                        .vmux = CX231XX_VIN_2_1,
 658                        .amux = CX231XX_AMUX_LINE_IN,
 659                        .gpio = NULL,
 660                }, {
 661                        .type = CX231XX_VMUX_SVIDEO,
 662                        .vmux = CX231XX_VIN_1_1 |
 663                                (CX231XX_VIN_1_2 << 8) |
 664                                CX25840_SVIDEO_ON,
 665                        .amux = CX231XX_AMUX_LINE_IN,
 666                        .gpio = NULL,
 667                } },
 668        },
 669        [CX231XX_BOARD_OTG102] = {
 670                .name = "Geniatech OTG102",
 671                .tuner_type = TUNER_ABSENT,
 672                .decoder = CX231XX_AVDECODER,
 673                .output_mode = OUT_MODE_VIP11,
 674                .ctl_pin_status_mask = 0xFFFFFFC4,
 675                .agc_analog_digital_select_gpio = 0x0c,
 676                        /* According with PV CxPlrCAP.inf file */
 677                .gpio_pin_status_mask = 0x4001000,
 678                .norm = V4L2_STD_NTSC,
 679                .no_alt_vanc = 1,
 680                .external_av = 1,
 681                /*.has_417 = 1, */
 682                /* This board is believed to have a hardware encoding chip
 683                 * supporting mpeg1/2/4, but as the 417 is apparently not
 684                 * working for the reference board it is not here either. */
 685
 686                .input = {{
 687                                .type = CX231XX_VMUX_COMPOSITE1,
 688                                .vmux = CX231XX_VIN_2_1,
 689                                .amux = CX231XX_AMUX_LINE_IN,
 690                                .gpio = NULL,
 691                        }, {
 692                                .type = CX231XX_VMUX_SVIDEO,
 693                                .vmux = CX231XX_VIN_1_1 |
 694                                        (CX231XX_VIN_1_2 << 8) |
 695                                        CX25840_SVIDEO_ON,
 696                                .amux = CX231XX_AMUX_LINE_IN,
 697                                .gpio = NULL,
 698                        }
 699                },
 700        },
 701        [CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {
 702                .name = "Hauppauge WinTV 930C-HD (1113xx) / HVR-900H (111xxx) / PCTV QuatroStick 521e",
 703                .tuner_type = TUNER_NXP_TDA18271,
 704                .tuner_addr = 0x60,
 705                .tuner_gpio = RDE250_XCV_TUNER,
 706                .tuner_sif_gpio = 0x05,
 707                .tuner_scl_gpio = 0x1a,
 708                .tuner_sda_gpio = 0x1b,
 709                .decoder = CX231XX_AVDECODER,
 710                .output_mode = OUT_MODE_VIP11,
 711                .demod_xfer_mode = 0,
 712                .ctl_pin_status_mask = 0xFFFFFFC4,
 713                .agc_analog_digital_select_gpio = 0x0c,
 714                .gpio_pin_status_mask = 0x4001000,
 715                .tuner_i2c_master = I2C_1_MUX_3,
 716                .demod_i2c_master = I2C_1_MUX_3,
 717                .has_dvb = 1,
 718                .demod_addr = 0x0e,
 719                .norm = V4L2_STD_PAL,
 720
 721                .input = {{
 722                        .type = CX231XX_VMUX_TELEVISION,
 723                        .vmux = CX231XX_VIN_3_1,
 724                        .amux = CX231XX_AMUX_VIDEO,
 725                        .gpio = NULL,
 726                }, {
 727                        .type = CX231XX_VMUX_COMPOSITE1,
 728                        .vmux = CX231XX_VIN_2_1,
 729                        .amux = CX231XX_AMUX_LINE_IN,
 730                        .gpio = NULL,
 731                }, {
 732                        .type = CX231XX_VMUX_SVIDEO,
 733                        .vmux = CX231XX_VIN_1_1 |
 734                                (CX231XX_VIN_1_2 << 8) |
 735                                CX25840_SVIDEO_ON,
 736                        .amux = CX231XX_AMUX_LINE_IN,
 737                        .gpio = NULL,
 738                } },
 739        },
 740        [CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx] = {
 741                .name = "Hauppauge WinTV 930C-HD (1114xx) / HVR-901H (1114xx) / PCTV QuatroStick 522e",
 742                .tuner_type = TUNER_ABSENT,
 743                .tuner_addr = 0x60,
 744                .tuner_gpio = RDE250_XCV_TUNER,
 745                .tuner_sif_gpio = 0x05,
 746                .tuner_scl_gpio = 0x1a,
 747                .tuner_sda_gpio = 0x1b,
 748                .decoder = CX231XX_AVDECODER,
 749                .output_mode = OUT_MODE_VIP11,
 750                .demod_xfer_mode = 0,
 751                .ctl_pin_status_mask = 0xFFFFFFC4,
 752                .agc_analog_digital_select_gpio = 0x0c,
 753                .gpio_pin_status_mask = 0x4001000,
 754                .tuner_i2c_master = I2C_1_MUX_3,
 755                .demod_i2c_master = I2C_1_MUX_3,
 756                .has_dvb = 1,
 757                .demod_addr = 0x0e,
 758                .norm = V4L2_STD_PAL,
 759
 760                .input = {{
 761                        .type = CX231XX_VMUX_TELEVISION,
 762                        .vmux = CX231XX_VIN_3_1,
 763                        .amux = CX231XX_AMUX_VIDEO,
 764                        .gpio = NULL,
 765                }, {
 766                        .type = CX231XX_VMUX_COMPOSITE1,
 767                        .vmux = CX231XX_VIN_2_1,
 768                        .amux = CX231XX_AMUX_LINE_IN,
 769                        .gpio = NULL,
 770                }, {
 771                        .type = CX231XX_VMUX_SVIDEO,
 772                        .vmux = CX231XX_VIN_1_1 |
 773                                (CX231XX_VIN_1_2 << 8) |
 774                                CX25840_SVIDEO_ON,
 775                        .amux = CX231XX_AMUX_LINE_IN,
 776                        .gpio = NULL,
 777                } },
 778        },
 779        [CX231XX_BOARD_HAUPPAUGE_955Q] = {
 780                .name = "Hauppauge WinTV-HVR-955Q (111401)",
 781                .tuner_type = TUNER_ABSENT,
 782                .tuner_addr = 0x60,
 783                .tuner_gpio = RDE250_XCV_TUNER,
 784                .tuner_sif_gpio = 0x05,
 785                .tuner_scl_gpio = 0x1a,
 786                .tuner_sda_gpio = 0x1b,
 787                .decoder = CX231XX_AVDECODER,
 788                .output_mode = OUT_MODE_VIP11,
 789                .demod_xfer_mode = 0,
 790                .ctl_pin_status_mask = 0xFFFFFFC4,
 791                .agc_analog_digital_select_gpio = 0x0c,
 792                .gpio_pin_status_mask = 0x4001000,
 793                .tuner_i2c_master = I2C_1_MUX_3,
 794                .demod_i2c_master = I2C_1_MUX_3,
 795                .has_dvb = 1,
 796                .demod_addr = 0x0e,
 797                .norm = V4L2_STD_NTSC,
 798
 799                .input = {{
 800                        .type = CX231XX_VMUX_TELEVISION,
 801                        .vmux = CX231XX_VIN_3_1,
 802                        .amux = CX231XX_AMUX_VIDEO,
 803                        .gpio = NULL,
 804                }, {
 805                        .type = CX231XX_VMUX_COMPOSITE1,
 806                        .vmux = CX231XX_VIN_2_1,
 807                        .amux = CX231XX_AMUX_LINE_IN,
 808                        .gpio = NULL,
 809                }, {
 810                        .type = CX231XX_VMUX_SVIDEO,
 811                        .vmux = CX231XX_VIN_1_1 |
 812                                (CX231XX_VIN_1_2 << 8) |
 813                                CX25840_SVIDEO_ON,
 814                        .amux = CX231XX_AMUX_LINE_IN,
 815                        .gpio = NULL,
 816                } },
 817        },
 818        [CX231XX_BOARD_TERRATEC_GRABBY] = {
 819                .name = "Terratec Grabby",
 820                .tuner_type = TUNER_ABSENT,
 821                .decoder = CX231XX_AVDECODER,
 822                .output_mode = OUT_MODE_VIP11,
 823                .demod_xfer_mode = 0,
 824                .ctl_pin_status_mask = 0xFFFFFFC4,
 825                .agc_analog_digital_select_gpio = 0x0c,
 826                .gpio_pin_status_mask = 0x4001000,
 827                .norm = V4L2_STD_PAL,
 828                .no_alt_vanc = 1,
 829                .external_av = 1,
 830                .input = {{
 831                        .type = CX231XX_VMUX_COMPOSITE1,
 832                        .vmux = CX231XX_VIN_2_1,
 833                        .amux = CX231XX_AMUX_LINE_IN,
 834                        .gpio = NULL,
 835                }, {
 836                        .type = CX231XX_VMUX_SVIDEO,
 837                        .vmux = CX231XX_VIN_1_1 |
 838                                (CX231XX_VIN_1_2 << 8) |
 839                                CX25840_SVIDEO_ON,
 840                        .amux = CX231XX_AMUX_LINE_IN,
 841                        .gpio = NULL,
 842                } },
 843        },
 844        [CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD] = {
 845                .name = "Evromedia USB Full Hybrid Full HD",
 846                .tuner_type = TUNER_ABSENT,
 847                .demod_addr = 0x64, /* 0xc8 >> 1 */
 848                .demod_i2c_master = I2C_1_MUX_3,
 849                .has_dvb = 1,
 850                .decoder = CX231XX_AVDECODER,
 851                .norm = V4L2_STD_PAL,
 852                .output_mode = OUT_MODE_VIP11,
 853                .tuner_addr = 0x60, /* 0xc0 >> 1 */
 854                .tuner_i2c_master = I2C_2,
 855                .input = {{
 856                        .type = CX231XX_VMUX_TELEVISION,
 857                        .vmux = 0,
 858                        .amux = CX231XX_AMUX_VIDEO,
 859                }, {
 860                        .type = CX231XX_VMUX_COMPOSITE1,
 861                        .vmux = CX231XX_VIN_2_1,
 862                        .amux = CX231XX_AMUX_LINE_IN,
 863                }, {
 864                        .type = CX231XX_VMUX_SVIDEO,
 865                        .vmux = CX231XX_VIN_1_1 |
 866                                (CX231XX_VIN_1_2 << 8) |
 867                                CX25840_SVIDEO_ON,
 868                        .amux = CX231XX_AMUX_LINE_IN,
 869                } },
 870        },
 871        [CX231XX_BOARD_ASTROMETA_T2HYBRID] = {
 872                .name = "Astrometa T2hybrid",
 873                .tuner_type = TUNER_ABSENT,
 874                .has_dvb = 1,
 875                .decoder = CX231XX_AVDECODER,
 876                .output_mode = OUT_MODE_VIP11,
 877                .agc_analog_digital_select_gpio = 0x01,
 878                .ctl_pin_status_mask = 0xffffffc4,
 879                .demod_addr = 0x18, /* 0x30 >> 1 */
 880                .demod_i2c_master = I2C_1_MUX_1,
 881                .gpio_pin_status_mask = 0xa,
 882                .norm = V4L2_STD_NTSC,
 883                .tuner_addr = 0x3a, /* 0x74 >> 1 */
 884                .tuner_i2c_master = I2C_1_MUX_3,
 885                .tuner_scl_gpio = 0x1a,
 886                .tuner_sda_gpio = 0x1b,
 887                .tuner_sif_gpio = 0x05,
 888                .input = {{
 889                                .type = CX231XX_VMUX_TELEVISION,
 890                                .vmux = CX231XX_VIN_1_1,
 891                                .amux = CX231XX_AMUX_VIDEO,
 892                        }, {
 893                                .type = CX231XX_VMUX_COMPOSITE1,
 894                                .vmux = CX231XX_VIN_2_1,
 895                                .amux = CX231XX_AMUX_LINE_IN,
 896                        },
 897                },
 898        },
 899        [CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO] = {
 900                .name = "The Imaging Source DFG/USB2pro",
 901                .tuner_type = TUNER_ABSENT,
 902                .decoder = CX231XX_AVDECODER,
 903                .output_mode = OUT_MODE_VIP11,
 904                .demod_xfer_mode = 0,
 905                .ctl_pin_status_mask = 0xFFFFFFC4,
 906                .agc_analog_digital_select_gpio = 0x0c,
 907                .gpio_pin_status_mask = 0x4001000,
 908                .norm = V4L2_STD_PAL,
 909                .no_alt_vanc = 1,
 910                .external_av = 1,
 911                .input = {{
 912                        .type = CX231XX_VMUX_COMPOSITE1,
 913                        .vmux = CX231XX_VIN_1_1,
 914                        .amux = CX231XX_AMUX_LINE_IN,
 915                        .gpio = NULL,
 916                }, {
 917                        .type = CX231XX_VMUX_SVIDEO,
 918                        .vmux = CX231XX_VIN_2_1 |
 919                                (CX231XX_VIN_2_2 << 8) |
 920                                CX25840_SVIDEO_ON,
 921                        .amux = CX231XX_AMUX_LINE_IN,
 922                        .gpio = NULL,
 923                } },
 924        },
 925        [CX231XX_BOARD_HAUPPAUGE_935C] = {
 926                .name = "Hauppauge WinTV-HVR-935C",
 927                .tuner_type = TUNER_ABSENT,
 928                .tuner_addr = 0x60,
 929                .tuner_gpio = RDE250_XCV_TUNER,
 930                .tuner_sif_gpio = 0x05,
 931                .tuner_scl_gpio = 0x1a,
 932                .tuner_sda_gpio = 0x1b,
 933                .decoder = CX231XX_AVDECODER,
 934                .output_mode = OUT_MODE_VIP11,
 935                .demod_xfer_mode = 0,
 936                .ctl_pin_status_mask = 0xFFFFFFC4,
 937                .agc_analog_digital_select_gpio = 0x0c,
 938                .gpio_pin_status_mask = 0x4001000,
 939                .tuner_i2c_master = I2C_1_MUX_3,
 940                .demod_i2c_master = I2C_1_MUX_3,
 941                .has_dvb = 1,
 942                .demod_addr = 0x64, /* 0xc8 >> 1 */
 943                .norm = V4L2_STD_PAL,
 944
 945                .input = {{
 946                        .type = CX231XX_VMUX_TELEVISION,
 947                        .vmux = CX231XX_VIN_3_1,
 948                        .amux = CX231XX_AMUX_VIDEO,
 949                        .gpio = NULL,
 950                }, {
 951                        .type = CX231XX_VMUX_COMPOSITE1,
 952                        .vmux = CX231XX_VIN_2_1,
 953                        .amux = CX231XX_AMUX_LINE_IN,
 954                        .gpio = NULL,
 955                }, {
 956                        .type = CX231XX_VMUX_SVIDEO,
 957                        .vmux = CX231XX_VIN_1_1 |
 958                                (CX231XX_VIN_1_2 << 8) |
 959                                CX25840_SVIDEO_ON,
 960                        .amux = CX231XX_AMUX_LINE_IN,
 961                        .gpio = NULL,
 962                } },
 963        },
 964        [CX231XX_BOARD_HAUPPAUGE_975] = {
 965                .name = "Hauppauge WinTV-HVR-975",
 966                .tuner_type = TUNER_ABSENT,
 967                .tuner_addr = 0x60,
 968                .tuner_gpio = RDE250_XCV_TUNER,
 969                .tuner_sif_gpio = 0x05,
 970                .tuner_scl_gpio = 0x1a,
 971                .tuner_sda_gpio = 0x1b,
 972                .decoder = CX231XX_AVDECODER,
 973                .output_mode = OUT_MODE_VIP11,
 974                .demod_xfer_mode = 0,
 975                .ctl_pin_status_mask = 0xFFFFFFC4,
 976                .agc_analog_digital_select_gpio = 0x0c,
 977                .gpio_pin_status_mask = 0x4001000,
 978                .tuner_i2c_master = I2C_1_MUX_3,
 979                .demod_i2c_master = I2C_1_MUX_3,
 980                .has_dvb = 1,
 981                .demod_addr = 0x59, /* 0xb2 >> 1 */
 982                .demod_addr2 = 0x64, /* 0xc8 >> 1 */
 983                .norm = V4L2_STD_ALL,
 984
 985                .input = {{
 986                        .type = CX231XX_VMUX_TELEVISION,
 987                        .vmux = CX231XX_VIN_3_1,
 988                        .amux = CX231XX_AMUX_VIDEO,
 989                        .gpio = NULL,
 990                }, {
 991                        .type = CX231XX_VMUX_COMPOSITE1,
 992                        .vmux = CX231XX_VIN_2_1,
 993                        .amux = CX231XX_AMUX_LINE_IN,
 994                        .gpio = NULL,
 995                }, {
 996                        .type = CX231XX_VMUX_SVIDEO,
 997                        .vmux = CX231XX_VIN_1_1 |
 998                                (CX231XX_VIN_1_2 << 8) |
 999                                CX25840_SVIDEO_ON,
1000                        .amux = CX231XX_AMUX_LINE_IN,
1001                        .gpio = NULL,
1002                } },
1003        },
1004};
1005const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
1006
1007/* table of devices that work with this driver */
1008struct usb_device_id cx231xx_id_table[] = {
1009        {USB_DEVICE(0x1D19, 0x6109),
1010        .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
1011        {USB_DEVICE(0x0572, 0x5A3C),
1012         .driver_info = CX231XX_BOARD_UNKNOWN},
1013        {USB_DEVICE(0x0572, 0x58A2),
1014         .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
1015        {USB_DEVICE(0x0572, 0x58A1),
1016         .driver_info = CX231XX_BOARD_CNXT_SHELBY},
1017        {USB_DEVICE(0x0572, 0x58A4),
1018         .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
1019        {USB_DEVICE(0x0572, 0x58A5),
1020         .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
1021        {USB_DEVICE(0x0572, 0x58A6),
1022         .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
1023        {USB_DEVICE(0x0572, 0x589E),
1024         .driver_info = CX231XX_BOARD_CNXT_RDE_250},
1025        {USB_DEVICE(0x0572, 0x58A0),
1026         .driver_info = CX231XX_BOARD_CNXT_RDU_250},
1027        {USB_DEVICE(0x2040, 0xb110),
1028         .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},
1029        {USB_DEVICE(0x2040, 0xb111),
1030         .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
1031        {USB_DEVICE(0x2040, 0xb120),
1032         .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
1033        {USB_DEVICE(0x2040, 0xb123),
1034         .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
1035        {USB_DEVICE(0x2040, 0xb151),
1036         .driver_info = CX231XX_BOARD_HAUPPAUGE_935C},
1037        {USB_DEVICE(0x2040, 0xb150),
1038         .driver_info = CX231XX_BOARD_HAUPPAUGE_975},
1039        {USB_DEVICE(0x2040, 0xb130),
1040         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1041        {USB_DEVICE(0x2040, 0xb131),
1042         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1043        /* Hauppauge WinTV-HVR-900-H */
1044        {USB_DEVICE(0x2040, 0xb138),
1045         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1046        /* Hauppauge WinTV-HVR-901-H */
1047        {USB_DEVICE(0x2040, 0xb139),
1048         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1049        {USB_DEVICE(0x2040, 0xb140),
1050         .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
1051        {USB_DEVICE(0x2040, 0xc200),
1052         .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},
1053        /* PCTV QuatroStick 521e */
1054        {USB_DEVICE(0x2013, 0x0259),
1055         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
1056        /* PCTV QuatroStick 522e */
1057        {USB_DEVICE(0x2013, 0x025e),
1058         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
1059        {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),
1060         .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},
1061        {USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),
1062         .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
1063        {USB_DEVICE(0x1b80, 0xe424),
1064         .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},
1065        {USB_DEVICE(0x1b80, 0xe421),
1066         .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},
1067        {USB_DEVICE(0x1f4d, 0x0237),
1068         .driver_info = CX231XX_BOARD_ICONBIT_U100},
1069        {USB_DEVICE(0x0fd9, 0x0037),
1070         .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
1071        {USB_DEVICE(0x1f4d, 0x0102),
1072         .driver_info = CX231XX_BOARD_OTG102},
1073        {USB_DEVICE(USB_VID_TERRATEC, 0x00a6),
1074         .driver_info = CX231XX_BOARD_TERRATEC_GRABBY},
1075        {USB_DEVICE(0x1b80, 0xd3b2),
1076        .driver_info = CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD},
1077        {USB_DEVICE(0x15f4, 0x0135),
1078        .driver_info = CX231XX_BOARD_ASTROMETA_T2HYBRID},
1079        {USB_DEVICE(0x199e, 0x8002),
1080         .driver_info = CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO},
1081        {},
1082};
1083
1084MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
1085
1086/* cx231xx_tuner_callback
1087 * will be used to reset XC5000 tuner using GPIO pin
1088 */
1089
1090int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
1091{
1092        int rc = 0;
1093        struct cx231xx *dev = ptr;
1094
1095        if (dev->tuner_type == TUNER_XC5000) {
1096                if (command == XC5000_TUNER_RESET) {
1097                        dev_dbg(dev->dev,
1098                                "Tuner CB: RESET: cmd %d : tuner type %d\n",
1099                                command, dev->tuner_type);
1100                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1101                                               1);
1102                        msleep(10);
1103                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1104                                               0);
1105                        msleep(330);
1106                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
1107                                               1);
1108                        msleep(10);
1109                }
1110        } else if (dev->tuner_type == TUNER_NXP_TDA18271) {
1111                switch (command) {
1112                case TDA18271_CALLBACK_CMD_AGC_ENABLE:
1113                        if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)
1114                                rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);
1115                        break;
1116                default:
1117                        rc = -EINVAL;
1118                        break;
1119                }
1120        }
1121        return rc;
1122}
1123EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
1124
1125static void cx231xx_reset_out(struct cx231xx *dev)
1126{
1127        cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1128        msleep(200);
1129        cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
1130        msleep(200);
1131        cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1132}
1133
1134static void cx231xx_enable_OSC(struct cx231xx *dev)
1135{
1136        cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
1137}
1138
1139static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
1140{
1141        cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
1142}
1143
1144static inline void cx231xx_set_model(struct cx231xx *dev)
1145{
1146        dev->board = cx231xx_boards[dev->model];
1147}
1148
1149/* Since cx231xx_pre_card_setup() requires a proper dev->model,
1150 * this won't work for boards with generic PCI IDs
1151 */
1152void cx231xx_pre_card_setup(struct cx231xx *dev)
1153{
1154        dev_info(dev->dev, "Identified as %s (card=%d)\n",
1155                dev->board.name, dev->model);
1156
1157        if (CX231XX_BOARD_ASTROMETA_T2HYBRID == dev->model) {
1158                /* turn on demodulator chip */
1159                cx231xx_set_gpio_value(dev, 0x03, 0x01);
1160        }
1161
1162        /* set the direction for GPIO pins */
1163        if (dev->board.tuner_gpio) {
1164                cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
1165                cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
1166        }
1167        if (dev->board.tuner_sif_gpio >= 0)
1168                cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
1169
1170        /* request some modules if any required */
1171
1172        /* set the mode to Analog mode initially */
1173        cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1174
1175        /* Unlock device */
1176        /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
1177
1178}
1179
1180static void cx231xx_config_tuner(struct cx231xx *dev)
1181{
1182        struct tuner_setup tun_setup;
1183        struct v4l2_frequency f;
1184
1185        if (dev->tuner_type == TUNER_ABSENT)
1186                return;
1187
1188        tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1189        tun_setup.type = dev->tuner_type;
1190        tun_setup.addr = dev->tuner_addr;
1191        tun_setup.tuner_callback = cx231xx_tuner_callback;
1192
1193        tuner_call(dev, tuner, s_type_addr, &tun_setup);
1194
1195#if 0
1196        if (tun_setup.type == TUNER_XC5000) {
1197                static struct xc2028_ctrl ctrl = {
1198                        .fname = XC5000_DEFAULT_FIRMWARE,
1199                        .max_len = 64,
1200                        .demod = 0;
1201                };
1202                struct v4l2_priv_tun_config cfg = {
1203                        .tuner = dev->tuner_type,
1204                        .priv = &ctrl,
1205                };
1206                tuner_call(dev, tuner, s_config, &cfg);
1207        }
1208#endif
1209        /* configure tuner */
1210        f.tuner = 0;
1211        f.type = V4L2_TUNER_ANALOG_TV;
1212        f.frequency = 9076;     /* just a magic number */
1213        dev->ctl_freq = f.frequency;
1214        call_all(dev, tuner, s_frequency, &f);
1215
1216}
1217
1218static int read_eeprom(struct cx231xx *dev, struct i2c_client *client,
1219                       u8 *eedata, int len)
1220{
1221        int ret;
1222        u8 start_offset = 0;
1223        int len_todo = len;
1224        u8 *eedata_cur = eedata;
1225        int i;
1226        struct i2c_msg msg_write = { .addr = client->addr, .flags = 0,
1227                .buf = &start_offset, .len = 1 };
1228        struct i2c_msg msg_read = { .addr = client->addr, .flags = I2C_M_RD };
1229
1230        /* start reading at offset 0 */
1231        ret = i2c_transfer(client->adapter, &msg_write, 1);
1232        if (ret < 0) {
1233                dev_err(dev->dev, "Can't read eeprom\n");
1234                return ret;
1235        }
1236
1237        while (len_todo > 0) {
1238                msg_read.len = (len_todo > 64) ? 64 : len_todo;
1239                msg_read.buf = eedata_cur;
1240
1241                ret = i2c_transfer(client->adapter, &msg_read, 1);
1242                if (ret < 0) {
1243                        dev_err(dev->dev, "Can't read eeprom\n");
1244                        return ret;
1245                }
1246                eedata_cur += msg_read.len;
1247                len_todo -= msg_read.len;
1248        }
1249
1250        for (i = 0; i + 15 < len; i += 16)
1251                dev_dbg(dev->dev, "i2c eeprom %02x: %*ph\n",
1252                        i, 16, &eedata[i]);
1253
1254        return 0;
1255}
1256
1257void cx231xx_card_setup(struct cx231xx *dev)
1258{
1259
1260        cx231xx_set_model(dev);
1261
1262        dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
1263        if (cx231xx_boards[dev->model].tuner_addr)
1264                dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
1265
1266        /* request some modules */
1267        if (dev->board.decoder == CX231XX_AVDECODER) {
1268                dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1269                                        cx231xx_get_i2c_adap(dev, I2C_0),
1270                                        "cx25840", 0x88 >> 1, NULL);
1271                if (dev->sd_cx25840 == NULL)
1272                        dev_err(dev->dev,
1273                                "cx25840 subdev registration failure\n");
1274                cx25840_call(dev, core, load_fw);
1275
1276        }
1277
1278        /* Initialize the tuner */
1279        if (dev->board.tuner_type != TUNER_ABSENT) {
1280                struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
1281                                                dev->board.tuner_i2c_master);
1282                dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1283                                                    tuner_i2c,
1284                                                    "tuner",
1285                                                    dev->tuner_addr, NULL);
1286                if (dev->sd_tuner == NULL)
1287                        dev_err(dev->dev,
1288                                "tuner subdev registration failure\n");
1289                else
1290                        cx231xx_config_tuner(dev);
1291        }
1292
1293        switch (dev->model) {
1294        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1295        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
1296        case CX231XX_BOARD_HAUPPAUGE_955Q:
1297        case CX231XX_BOARD_HAUPPAUGE_935C:
1298        case CX231XX_BOARD_HAUPPAUGE_975:
1299                {
1300                        struct eeprom {
1301                                struct tveeprom tvee;
1302                                u8 eeprom[256];
1303                                struct i2c_client client;
1304                        };
1305                        struct eeprom *e = kzalloc(sizeof(*e), GFP_KERNEL);
1306
1307                        if (e == NULL) {
1308                                dev_err(dev->dev,
1309                                        "failed to allocate memory to read eeprom\n");
1310                                break;
1311                        }
1312                        e->client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
1313                        e->client.addr = 0xa0 >> 1;
1314
1315                        read_eeprom(dev, &e->client, e->eeprom, sizeof(e->eeprom));
1316                        tveeprom_hauppauge_analog(&e->tvee, e->eeprom + 0xc0);
1317                        kfree(e);
1318                        break;
1319                }
1320        }
1321
1322}
1323
1324/*
1325 * cx231xx_config()
1326 * inits registers with sane defaults
1327 */
1328int cx231xx_config(struct cx231xx *dev)
1329{
1330        /* TBD need to add cx231xx specific code */
1331
1332        return 0;
1333}
1334
1335/*
1336 * cx231xx_config_i2c()
1337 * configure i2c attached devices
1338 */
1339void cx231xx_config_i2c(struct cx231xx *dev)
1340{
1341        /* u32 input = INPUT(dev->video_input)->vmux; */
1342
1343        call_all(dev, video, s_stream, 1);
1344}
1345
1346static void cx231xx_unregister_media_device(struct cx231xx *dev)
1347{
1348#ifdef CONFIG_MEDIA_CONTROLLER
1349        if (dev->media_dev) {
1350                media_device_unregister(dev->media_dev);
1351                media_device_cleanup(dev->media_dev);
1352                kfree(dev->media_dev);
1353                dev->media_dev = NULL;
1354        }
1355#endif
1356}
1357
1358/*
1359 * cx231xx_realease_resources()
1360 * unregisters the v4l2,i2c and usb devices
1361 * called when the device gets disconected or at module unload
1362*/
1363void cx231xx_release_resources(struct cx231xx *dev)
1364{
1365        cx231xx_ir_exit(dev);
1366
1367        cx231xx_release_analog_resources(dev);
1368
1369        cx231xx_remove_from_devlist(dev);
1370
1371        /* Release I2C buses */
1372        cx231xx_dev_uninit(dev);
1373
1374        /* delete v4l2 device */
1375        v4l2_device_unregister(&dev->v4l2_dev);
1376
1377        cx231xx_unregister_media_device(dev);
1378
1379        usb_put_dev(dev->udev);
1380
1381        /* Mark device as unused */
1382        clear_bit(dev->devno, &cx231xx_devused);
1383}
1384
1385static int cx231xx_media_device_init(struct cx231xx *dev,
1386                                      struct usb_device *udev)
1387{
1388#ifdef CONFIG_MEDIA_CONTROLLER
1389        struct media_device *mdev;
1390
1391        mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
1392        if (!mdev)
1393                return -ENOMEM;
1394
1395        media_device_usb_init(mdev, udev, dev->board.name);
1396
1397        dev->media_dev = mdev;
1398#endif
1399        return 0;
1400}
1401
1402/*
1403 * cx231xx_init_dev()
1404 * allocates and inits the device structs, registers i2c bus and v4l device
1405 */
1406static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
1407                            int minor)
1408{
1409        int retval = -ENOMEM;
1410        unsigned int maxh, maxw;
1411
1412        dev->udev = udev;
1413        mutex_init(&dev->lock);
1414        mutex_init(&dev->ctrl_urb_lock);
1415        mutex_init(&dev->gpio_i2c_lock);
1416        mutex_init(&dev->i2c_lock);
1417
1418        spin_lock_init(&dev->video_mode.slock);
1419        spin_lock_init(&dev->vbi_mode.slock);
1420        spin_lock_init(&dev->sliced_cc_mode.slock);
1421
1422        init_waitqueue_head(&dev->open);
1423        init_waitqueue_head(&dev->wait_frame);
1424        init_waitqueue_head(&dev->wait_stream);
1425
1426        dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
1427        dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
1428        dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
1429        dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
1430        dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
1431
1432        /* Query cx231xx to find what pcb config it is related to */
1433        retval = initialize_cx231xx(dev);
1434        if (retval < 0) {
1435                dev_err(dev->dev, "Failed to read PCB config\n");
1436                return retval;
1437        }
1438
1439        /*To workaround error number=-71 on EP0 for VideoGrabber,
1440                 need set alt here.*/
1441        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
1442            dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
1443                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1444                cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
1445        }
1446        /* Cx231xx pre card setup */
1447        cx231xx_pre_card_setup(dev);
1448
1449        retval = cx231xx_config(dev);
1450        if (retval) {
1451                dev_err(dev->dev, "error configuring device\n");
1452                return -ENOMEM;
1453        }
1454
1455        /* set default norm */
1456        dev->norm = dev->board.norm;
1457
1458        /* register i2c bus */
1459        retval = cx231xx_dev_init(dev);
1460        if (retval) {
1461                dev_err(dev->dev,
1462                        "%s: cx231xx_i2c_register - errCode [%d]!\n",
1463                        __func__, retval);
1464                goto err_dev_init;
1465        }
1466
1467        /* Do board specific init */
1468        cx231xx_card_setup(dev);
1469
1470        /* configure the device */
1471        cx231xx_config_i2c(dev);
1472
1473        maxw = norm_maxw(dev);
1474        maxh = norm_maxh(dev);
1475
1476        /* set default image size */
1477        dev->width = maxw;
1478        dev->height = maxh;
1479        dev->interlaced = 0;
1480        dev->video_input = 0;
1481
1482        retval = cx231xx_config(dev);
1483        if (retval) {
1484                dev_err(dev->dev, "%s: cx231xx_config - errCode [%d]!\n",
1485                        __func__, retval);
1486                goto err_dev_init;
1487        }
1488
1489        /* init video dma queues */
1490        INIT_LIST_HEAD(&dev->video_mode.vidq.active);
1491        INIT_LIST_HEAD(&dev->video_mode.vidq.queued);
1492
1493        /* init vbi dma queues */
1494        INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
1495        INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
1496
1497        /* Reset other chips required if they are tied up with GPIO pins */
1498        cx231xx_add_into_devlist(dev);
1499
1500        if (dev->board.has_417) {
1501                dev_info(dev->dev, "attach 417 %d\n", dev->model);
1502                if (cx231xx_417_register(dev) < 0) {
1503                        dev_err(dev->dev,
1504                                "%s() Failed to register 417 on VID_B\n",
1505                                __func__);
1506                }
1507        }
1508
1509        retval = cx231xx_register_analog_devices(dev);
1510        if (retval)
1511                goto err_analog;
1512
1513        cx231xx_ir_init(dev);
1514
1515        cx231xx_init_extension(dev);
1516
1517        return 0;
1518err_analog:
1519        cx231xx_unregister_media_device(dev);
1520        cx231xx_release_analog_resources(dev);
1521        cx231xx_remove_from_devlist(dev);
1522err_dev_init:
1523        cx231xx_dev_uninit(dev);
1524        return retval;
1525}
1526
1527#if defined(CONFIG_MODULES) && defined(MODULE)
1528static void request_module_async(struct work_struct *work)
1529{
1530        struct cx231xx *dev = container_of(work,
1531                                           struct cx231xx, request_module_wk);
1532
1533        if (dev->has_alsa_audio)
1534                request_module("cx231xx-alsa");
1535
1536        if (dev->board.has_dvb)
1537                request_module("cx231xx-dvb");
1538
1539}
1540
1541static void request_modules(struct cx231xx *dev)
1542{
1543        INIT_WORK(&dev->request_module_wk, request_module_async);
1544        schedule_work(&dev->request_module_wk);
1545}
1546
1547static void flush_request_modules(struct cx231xx *dev)
1548{
1549        flush_work(&dev->request_module_wk);
1550}
1551#else
1552#define request_modules(dev)
1553#define flush_request_modules(dev)
1554#endif /* CONFIG_MODULES */
1555
1556static int cx231xx_init_v4l2(struct cx231xx *dev,
1557                             struct usb_device *udev,
1558                             struct usb_interface *interface,
1559                             int isoc_pipe)
1560{
1561        struct usb_interface *uif;
1562        int i, idx;
1563
1564        /* Video Init */
1565
1566        /* compute alternate max packet sizes for video */
1567        idx = dev->current_pcb_config.hs_config_info[0].interface_info.video_index + 1;
1568        if (idx >= dev->max_iad_interface_count) {
1569                dev_err(dev->dev,
1570                        "Video PCB interface #%d doesn't exist\n", idx);
1571                return -ENODEV;
1572        }
1573
1574        uif = udev->actconfig->interface[idx];
1575
1576        if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1577                return -ENODEV;
1578
1579        dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;
1580        dev->video_mode.num_alt = uif->num_altsetting;
1581
1582        dev_info(dev->dev,
1583                 "video EndPoint Addr 0x%x, Alternate settings: %i\n",
1584                 dev->video_mode.end_point_addr,
1585                 dev->video_mode.num_alt);
1586
1587        dev->video_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->video_mode.num_alt, GFP_KERNEL);
1588        if (dev->video_mode.alt_max_pkt_size == NULL)
1589                return -ENOMEM;
1590
1591        for (i = 0; i < dev->video_mode.num_alt; i++) {
1592                u16 tmp;
1593
1594                if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1595                        return -ENODEV;
1596
1597                tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
1598                dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1599                dev_dbg(dev->dev,
1600                        "Alternate setting %i, max size= %i\n", i,
1601                        dev->video_mode.alt_max_pkt_size[i]);
1602        }
1603
1604        /* VBI Init */
1605
1606        idx = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index + 1;
1607        if (idx >= dev->max_iad_interface_count) {
1608                dev_err(dev->dev,
1609                        "VBI PCB interface #%d doesn't exist\n", idx);
1610                return -ENODEV;
1611        }
1612        uif = udev->actconfig->interface[idx];
1613
1614        if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1615                return -ENODEV;
1616
1617        dev->vbi_mode.end_point_addr =
1618            uif->altsetting[0].endpoint[isoc_pipe].desc.
1619                        bEndpointAddress;
1620
1621        dev->vbi_mode.num_alt = uif->num_altsetting;
1622        dev_info(dev->dev,
1623                 "VBI EndPoint Addr 0x%x, Alternate settings: %i\n",
1624                 dev->vbi_mode.end_point_addr,
1625                 dev->vbi_mode.num_alt);
1626
1627        /* compute alternate max packet sizes for vbi */
1628        dev->vbi_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->vbi_mode.num_alt, GFP_KERNEL);
1629        if (dev->vbi_mode.alt_max_pkt_size == NULL)
1630                return -ENOMEM;
1631
1632        for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1633                u16 tmp;
1634
1635                if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1636                        return -ENODEV;
1637
1638                tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1639                                desc.wMaxPacketSize);
1640                dev->vbi_mode.alt_max_pkt_size[i] =
1641                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1642                dev_dbg(dev->dev,
1643                        "Alternate setting %i, max size= %i\n", i,
1644                        dev->vbi_mode.alt_max_pkt_size[i]);
1645        }
1646
1647        /* Sliced CC VBI init */
1648
1649        /* compute alternate max packet sizes for sliced CC */
1650        idx = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index + 1;
1651        if (idx >= dev->max_iad_interface_count) {
1652                dev_err(dev->dev,
1653                        "Sliced CC PCB interface #%d doesn't exist\n", idx);
1654                return -ENODEV;
1655        }
1656        uif = udev->actconfig->interface[idx];
1657
1658        if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1659                return -ENODEV;
1660
1661        dev->sliced_cc_mode.end_point_addr =
1662            uif->altsetting[0].endpoint[isoc_pipe].desc.
1663                        bEndpointAddress;
1664
1665        dev->sliced_cc_mode.num_alt = uif->num_altsetting;
1666        dev_info(dev->dev,
1667                 "sliced CC EndPoint Addr 0x%x, Alternate settings: %i\n",
1668                 dev->sliced_cc_mode.end_point_addr,
1669                 dev->sliced_cc_mode.num_alt);
1670        dev->sliced_cc_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->sliced_cc_mode.num_alt, GFP_KERNEL);
1671        if (dev->sliced_cc_mode.alt_max_pkt_size == NULL)
1672                return -ENOMEM;
1673
1674        for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1675                u16 tmp;
1676
1677                if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1678                        return -ENODEV;
1679
1680                tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1681                                desc.wMaxPacketSize);
1682                dev->sliced_cc_mode.alt_max_pkt_size[i] =
1683                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1684                dev_dbg(dev->dev,
1685                        "Alternate setting %i, max size= %i\n", i,
1686                        dev->sliced_cc_mode.alt_max_pkt_size[i]);
1687        }
1688
1689        return 0;
1690}
1691
1692/*
1693 * cx231xx_usb_probe()
1694 * checks for supported devices
1695 */
1696static int cx231xx_usb_probe(struct usb_interface *interface,
1697                             const struct usb_device_id *id)
1698{
1699        struct usb_device *udev;
1700        struct device *d = &interface->dev;
1701        struct usb_interface *uif;
1702        struct cx231xx *dev = NULL;
1703        int retval = -ENODEV;
1704        int nr = 0, ifnum;
1705        int i, isoc_pipe = 0;
1706        char *speed;
1707        u8 idx;
1708        struct usb_interface_assoc_descriptor *assoc_desc;
1709
1710        ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1711
1712        /*
1713         * Interface number 0 - IR interface (handled by mceusb driver)
1714         * Interface number 1 - AV interface (handled by this driver)
1715         */
1716        if (ifnum != 1)
1717                return -ENODEV;
1718
1719        /* Check to see next free device and mark as used */
1720        do {
1721                nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
1722                if (nr >= CX231XX_MAXBOARDS) {
1723                        /* No free device slots */
1724                        dev_err(d,
1725                                "Supports only %i devices.\n",
1726                                CX231XX_MAXBOARDS);
1727                        return -ENOMEM;
1728                }
1729        } while (test_and_set_bit(nr, &cx231xx_devused));
1730
1731        udev = usb_get_dev(interface_to_usbdev(interface));
1732
1733        /* allocate memory for our device state and initialize it */
1734        dev = devm_kzalloc(&udev->dev, sizeof(*dev), GFP_KERNEL);
1735        if (dev == NULL) {
1736                retval = -ENOMEM;
1737                goto err_if;
1738        }
1739
1740        snprintf(dev->name, 29, "cx231xx #%d", nr);
1741        dev->devno = nr;
1742        dev->model = id->driver_info;
1743        dev->video_mode.alt = -1;
1744        dev->dev = d;
1745
1746        cx231xx_set_model(dev);
1747
1748        dev->interface_count++;
1749        /* reset gpio dir and value */
1750        dev->gpio_dir = 0;
1751        dev->gpio_val = 0;
1752        dev->xc_fw_load_done = 0;
1753        dev->has_alsa_audio = 1;
1754        dev->power_mode = -1;
1755        atomic_set(&dev->devlist_count, 0);
1756
1757        /* 0 - vbi ; 1 -sliced cc mode */
1758        dev->vbi_or_sliced_cc_mode = 0;
1759
1760        /* get maximum no.of IAD interfaces */
1761        dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;
1762
1763        /* init CIR module TBD */
1764
1765        /*mode_tv: digital=1 or analog=0*/
1766        dev->mode_tv = 0;
1767
1768        dev->USE_ISO = transfer_mode;
1769
1770        switch (udev->speed) {
1771        case USB_SPEED_LOW:
1772                speed = "1.5";
1773                break;
1774        case USB_SPEED_UNKNOWN:
1775        case USB_SPEED_FULL:
1776                speed = "12";
1777                break;
1778        case USB_SPEED_HIGH:
1779                speed = "480";
1780                break;
1781        default:
1782                speed = "unknown";
1783        }
1784
1785        dev_info(d,
1786                 "New device %s %s @ %s Mbps (%04x:%04x) with %d interfaces\n",
1787                 udev->manufacturer ? udev->manufacturer : "",
1788                 udev->product ? udev->product : "",
1789                 speed,
1790                 le16_to_cpu(udev->descriptor.idVendor),
1791                 le16_to_cpu(udev->descriptor.idProduct),
1792                 dev->max_iad_interface_count);
1793
1794        /* increment interface count */
1795        dev->interface_count++;
1796
1797        /* get device number */
1798        nr = dev->devno;
1799
1800        assoc_desc = udev->actconfig->intf_assoc[0];
1801        if (!assoc_desc || assoc_desc->bFirstInterface != ifnum) {
1802                dev_err(d, "Not found matching IAD interface\n");
1803                retval = -ENODEV;
1804                goto err_if;
1805        }
1806
1807        dev_dbg(d, "registering interface %d\n", ifnum);
1808
1809        /* save our data pointer in this interface device */
1810        usb_set_intfdata(interface, dev);
1811
1812        /* Initialize the media controller */
1813        retval = cx231xx_media_device_init(dev, udev);
1814        if (retval) {
1815                dev_err(d, "cx231xx_media_device_init failed\n");
1816                goto err_media_init;
1817        }
1818
1819        /* Create v4l2 device */
1820#ifdef CONFIG_MEDIA_CONTROLLER
1821        dev->v4l2_dev.mdev = dev->media_dev;
1822#endif
1823        retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
1824        if (retval) {
1825                dev_err(d, "v4l2_device_register failed\n");
1826                goto err_v4l2;
1827        }
1828
1829        /* allocate device struct */
1830        retval = cx231xx_init_dev(dev, udev, nr);
1831        if (retval)
1832                goto err_init;
1833
1834        retval = cx231xx_init_v4l2(dev, udev, interface, isoc_pipe);
1835        if (retval)
1836                goto err_init;
1837
1838        if (dev->current_pcb_config.ts1_source != 0xff) {
1839                /* compute alternate max packet sizes for TS1 */
1840                idx = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index + 1;
1841                if (idx >= dev->max_iad_interface_count) {
1842                        dev_err(d, "TS1 PCB interface #%d doesn't exist\n",
1843                                idx);
1844                        retval = -ENODEV;
1845                        goto err_video_alt;
1846                }
1847                uif = udev->actconfig->interface[idx];
1848
1849                if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1) {
1850                        retval = -ENODEV;
1851                        goto err_video_alt;
1852                }
1853
1854                dev->ts1_mode.end_point_addr =
1855                    uif->altsetting[0].endpoint[isoc_pipe].
1856                                desc.bEndpointAddress;
1857
1858                dev->ts1_mode.num_alt = uif->num_altsetting;
1859                dev_info(d,
1860                         "TS EndPoint Addr 0x%x, Alternate settings: %i\n",
1861                         dev->ts1_mode.end_point_addr,
1862                         dev->ts1_mode.num_alt);
1863
1864                dev->ts1_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->ts1_mode.num_alt, GFP_KERNEL);
1865                if (dev->ts1_mode.alt_max_pkt_size == NULL) {
1866                        retval = -ENOMEM;
1867                        goto err_video_alt;
1868                }
1869
1870                for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1871                        u16 tmp;
1872
1873                        if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1) {
1874                                retval = -ENODEV;
1875                                goto err_video_alt;
1876                        }
1877
1878                        tmp = le16_to_cpu(uif->altsetting[i].
1879                                                endpoint[isoc_pipe].desc.
1880                                                wMaxPacketSize);
1881                        dev->ts1_mode.alt_max_pkt_size[i] =
1882                            (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1883                        dev_dbg(d, "Alternate setting %i, max size= %i\n",
1884                                i, dev->ts1_mode.alt_max_pkt_size[i]);
1885                }
1886        }
1887
1888        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1889                cx231xx_enable_OSC(dev);
1890                cx231xx_reset_out(dev);
1891                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1892        }
1893
1894        if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
1895                cx231xx_sleep_s5h1432(dev);
1896
1897        /* load other modules required */
1898        request_modules(dev);
1899
1900#ifdef CONFIG_MEDIA_CONTROLLER
1901        /* Init entities at the Media Controller */
1902        cx231xx_v4l2_create_entities(dev);
1903
1904        retval = v4l2_mc_create_media_graph(dev->media_dev);
1905        if (!retval)
1906                retval = media_device_register(dev->media_dev);
1907#endif
1908        if (retval < 0)
1909                cx231xx_release_resources(dev);
1910        return retval;
1911
1912err_video_alt:
1913        /* cx231xx_uninit_dev: */
1914        cx231xx_close_extension(dev);
1915        cx231xx_ir_exit(dev);
1916        cx231xx_release_analog_resources(dev);
1917        cx231xx_417_unregister(dev);
1918        cx231xx_remove_from_devlist(dev);
1919        cx231xx_dev_uninit(dev);
1920err_init:
1921        v4l2_device_unregister(&dev->v4l2_dev);
1922err_v4l2:
1923        cx231xx_unregister_media_device(dev);
1924err_media_init:
1925        usb_set_intfdata(interface, NULL);
1926err_if:
1927        usb_put_dev(udev);
1928        clear_bit(nr, &cx231xx_devused);
1929        return retval;
1930}
1931
1932/*
1933 * cx231xx_usb_disconnect()
1934 * called when the device gets diconencted
1935 * video device will be unregistered on v4l2_close in case it is still open
1936 */
1937static void cx231xx_usb_disconnect(struct usb_interface *interface)
1938{
1939        struct cx231xx *dev;
1940
1941        dev = usb_get_intfdata(interface);
1942        usb_set_intfdata(interface, NULL);
1943
1944        if (!dev)
1945                return;
1946
1947        if (!dev->udev)
1948                return;
1949
1950        dev->state |= DEV_DISCONNECTED;
1951
1952        flush_request_modules(dev);
1953
1954        /* wait until all current v4l2 io is finished then deallocate
1955           resources */
1956        mutex_lock(&dev->lock);
1957
1958        wake_up_interruptible_all(&dev->open);
1959
1960        if (dev->users) {
1961                dev_warn(dev->dev,
1962                         "device %s is open! Deregistration and memory deallocation are deferred on close.\n",
1963                         video_device_node_name(&dev->vdev));
1964
1965                /* Even having users, it is safe to remove the RC i2c driver */
1966                cx231xx_ir_exit(dev);
1967
1968                if (dev->USE_ISO)
1969                        cx231xx_uninit_isoc(dev);
1970                else
1971                        cx231xx_uninit_bulk(dev);
1972                wake_up_interruptible(&dev->wait_frame);
1973                wake_up_interruptible(&dev->wait_stream);
1974        } else {
1975        }
1976
1977        cx231xx_close_extension(dev);
1978
1979        mutex_unlock(&dev->lock);
1980
1981        if (!dev->users)
1982                cx231xx_release_resources(dev);
1983}
1984
1985static struct usb_driver cx231xx_usb_driver = {
1986        .name = "cx231xx",
1987        .probe = cx231xx_usb_probe,
1988        .disconnect = cx231xx_usb_disconnect,
1989        .id_table = cx231xx_id_table,
1990};
1991
1992module_usb_driver(cx231xx_usb_driver);
1993