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 "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                .ir_i2c_master = I2C_0,
 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                .output_mode = OUT_MODE_VIP11,
 876                .agc_analog_digital_select_gpio = 0x01,
 877                .ctl_pin_status_mask = 0xffffffc4,
 878                .demod_addr = 0x18, /* 0x30 >> 1 */
 879                .demod_i2c_master = I2C_1_MUX_1,
 880                .gpio_pin_status_mask = 0xa,
 881                .norm = V4L2_STD_NTSC,
 882                .tuner_addr = 0x3a, /* 0x74 >> 1 */
 883                .tuner_i2c_master = I2C_1_MUX_3,
 884                .tuner_scl_gpio = 0x1a,
 885                .tuner_sda_gpio = 0x1b,
 886                .tuner_sif_gpio = 0x05,
 887                .input = {{
 888                                .type = CX231XX_VMUX_TELEVISION,
 889                                .vmux = CX231XX_VIN_1_1,
 890                                .amux = CX231XX_AMUX_VIDEO,
 891                        }, {
 892                                .type = CX231XX_VMUX_COMPOSITE1,
 893                                .vmux = CX231XX_VIN_2_1,
 894                                .amux = CX231XX_AMUX_LINE_IN,
 895                        },
 896                },
 897        },
 898};
 899const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
 900
 901/* table of devices that work with this driver */
 902struct usb_device_id cx231xx_id_table[] = {
 903        {USB_DEVICE(0x1D19, 0x6109),
 904        .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
 905        {USB_DEVICE(0x0572, 0x5A3C),
 906         .driver_info = CX231XX_BOARD_UNKNOWN},
 907        {USB_DEVICE(0x0572, 0x58A2),
 908         .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
 909        {USB_DEVICE(0x0572, 0x58A1),
 910         .driver_info = CX231XX_BOARD_CNXT_SHELBY},
 911        {USB_DEVICE(0x0572, 0x58A4),
 912         .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
 913        {USB_DEVICE(0x0572, 0x58A5),
 914         .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
 915        {USB_DEVICE(0x0572, 0x58A6),
 916         .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
 917        {USB_DEVICE(0x0572, 0x589E),
 918         .driver_info = CX231XX_BOARD_CNXT_RDE_250},
 919        {USB_DEVICE(0x0572, 0x58A0),
 920         .driver_info = CX231XX_BOARD_CNXT_RDU_250},
 921        {USB_DEVICE(0x2040, 0xb110),
 922         .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},
 923        {USB_DEVICE(0x2040, 0xb111),
 924         .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
 925        {USB_DEVICE(0x2040, 0xb120),
 926         .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
 927        {USB_DEVICE(0x2040, 0xb123),
 928         .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
 929        {USB_DEVICE(0x2040, 0xb130),
 930         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
 931        {USB_DEVICE(0x2040, 0xb131),
 932         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
 933        /* Hauppauge WinTV-HVR-900-H */
 934        {USB_DEVICE(0x2040, 0xb138),
 935         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
 936        /* Hauppauge WinTV-HVR-901-H */
 937        {USB_DEVICE(0x2040, 0xb139),
 938         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
 939        {USB_DEVICE(0x2040, 0xb140),
 940         .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
 941        {USB_DEVICE(0x2040, 0xc200),
 942         .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},
 943        /* PCTV QuatroStick 521e */
 944        {USB_DEVICE(0x2013, 0x0259),
 945         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
 946        /* PCTV QuatroStick 522e */
 947        {USB_DEVICE(0x2013, 0x025e),
 948         .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
 949        {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),
 950         .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},
 951        {USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),
 952         .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
 953        {USB_DEVICE(0x1b80, 0xe424),
 954         .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},
 955        {USB_DEVICE(0x1b80, 0xe421),
 956         .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},
 957        {USB_DEVICE(0x1f4d, 0x0237),
 958         .driver_info = CX231XX_BOARD_ICONBIT_U100},
 959        {USB_DEVICE(0x0fd9, 0x0037),
 960         .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
 961        {USB_DEVICE(0x1f4d, 0x0102),
 962         .driver_info = CX231XX_BOARD_OTG102},
 963        {USB_DEVICE(USB_VID_TERRATEC, 0x00a6),
 964         .driver_info = CX231XX_BOARD_TERRATEC_GRABBY},
 965        {USB_DEVICE(0x1b80, 0xd3b2),
 966        .driver_info = CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD},
 967        {USB_DEVICE(0x15f4, 0x0135),
 968        .driver_info = CX231XX_BOARD_ASTROMETA_T2HYBRID},
 969        {},
 970};
 971
 972MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
 973
 974/* cx231xx_tuner_callback
 975 * will be used to reset XC5000 tuner using GPIO pin
 976 */
 977
 978int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
 979{
 980        int rc = 0;
 981        struct cx231xx *dev = ptr;
 982
 983        if (dev->tuner_type == TUNER_XC5000) {
 984                if (command == XC5000_TUNER_RESET) {
 985                        dev_dbg(dev->dev,
 986                                "Tuner CB: RESET: cmd %d : tuner type %d\n",
 987                                command, dev->tuner_type);
 988                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
 989                                               1);
 990                        msleep(10);
 991                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
 992                                               0);
 993                        msleep(330);
 994                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
 995                                               1);
 996                        msleep(10);
 997                }
 998        } else if (dev->tuner_type == TUNER_NXP_TDA18271) {
 999                switch (command) {
1000                case TDA18271_CALLBACK_CMD_AGC_ENABLE:
1001                        if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)
1002                                rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);
1003                        break;
1004                default:
1005                        rc = -EINVAL;
1006                        break;
1007                }
1008        }
1009        return rc;
1010}
1011EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
1012
1013static void cx231xx_reset_out(struct cx231xx *dev)
1014{
1015        cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1016        msleep(200);
1017        cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
1018        msleep(200);
1019        cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
1020}
1021
1022static void cx231xx_enable_OSC(struct cx231xx *dev)
1023{
1024        cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
1025}
1026
1027static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
1028{
1029        cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
1030}
1031
1032static inline void cx231xx_set_model(struct cx231xx *dev)
1033{
1034        dev->board = cx231xx_boards[dev->model];
1035}
1036
1037/* Since cx231xx_pre_card_setup() requires a proper dev->model,
1038 * this won't work for boards with generic PCI IDs
1039 */
1040void cx231xx_pre_card_setup(struct cx231xx *dev)
1041{
1042        dev_info(dev->dev, "Identified as %s (card=%d)\n",
1043                dev->board.name, dev->model);
1044
1045        if (CX231XX_BOARD_ASTROMETA_T2HYBRID == dev->model) {
1046                /* turn on demodulator chip */
1047                cx231xx_set_gpio_value(dev, 0x03, 0x01);
1048        }
1049
1050        /* set the direction for GPIO pins */
1051        if (dev->board.tuner_gpio) {
1052                cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
1053                cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
1054        }
1055        if (dev->board.tuner_sif_gpio >= 0)
1056                cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
1057
1058        /* request some modules if any required */
1059
1060        /* set the mode to Analog mode initially */
1061        cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1062
1063        /* Unlock device */
1064        /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
1065
1066}
1067
1068static void cx231xx_config_tuner(struct cx231xx *dev)
1069{
1070        struct tuner_setup tun_setup;
1071        struct v4l2_frequency f;
1072
1073        if (dev->tuner_type == TUNER_ABSENT)
1074                return;
1075
1076        tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1077        tun_setup.type = dev->tuner_type;
1078        tun_setup.addr = dev->tuner_addr;
1079        tun_setup.tuner_callback = cx231xx_tuner_callback;
1080
1081        tuner_call(dev, tuner, s_type_addr, &tun_setup);
1082
1083#if 0
1084        if (tun_setup.type == TUNER_XC5000) {
1085                static struct xc2028_ctrl ctrl = {
1086                        .fname = XC5000_DEFAULT_FIRMWARE,
1087                        .max_len = 64,
1088                        .demod = 0;
1089                };
1090                struct v4l2_priv_tun_config cfg = {
1091                        .tuner = dev->tuner_type,
1092                        .priv = &ctrl,
1093                };
1094                tuner_call(dev, tuner, s_config, &cfg);
1095        }
1096#endif
1097        /* configure tuner */
1098        f.tuner = 0;
1099        f.type = V4L2_TUNER_ANALOG_TV;
1100        f.frequency = 9076;     /* just a magic number */
1101        dev->ctl_freq = f.frequency;
1102        call_all(dev, tuner, s_frequency, &f);
1103
1104}
1105
1106static int read_eeprom(struct cx231xx *dev, struct i2c_client *client,
1107                       u8 *eedata, int len)
1108{
1109        int ret = 0;
1110        u8 start_offset = 0;
1111        int len_todo = len;
1112        u8 *eedata_cur = eedata;
1113        int i;
1114        struct i2c_msg msg_write = { .addr = client->addr, .flags = 0,
1115                .buf = &start_offset, .len = 1 };
1116        struct i2c_msg msg_read = { .addr = client->addr, .flags = I2C_M_RD };
1117
1118        /* start reading at offset 0 */
1119        ret = i2c_transfer(client->adapter, &msg_write, 1);
1120        if (ret < 0) {
1121                dev_err(dev->dev, "Can't read eeprom\n");
1122                return ret;
1123        }
1124
1125        while (len_todo > 0) {
1126                msg_read.len = (len_todo > 64) ? 64 : len_todo;
1127                msg_read.buf = eedata_cur;
1128
1129                ret = i2c_transfer(client->adapter, &msg_read, 1);
1130                if (ret < 0) {
1131                        dev_err(dev->dev, "Can't read eeprom\n");
1132                        return ret;
1133                }
1134                eedata_cur += msg_read.len;
1135                len_todo -= msg_read.len;
1136        }
1137
1138        for (i = 0; i + 15 < len; i += 16)
1139                dev_dbg(dev->dev, "i2c eeprom %02x: %*ph\n",
1140                        i, 16, &eedata[i]);
1141
1142        return 0;
1143}
1144
1145void cx231xx_card_setup(struct cx231xx *dev)
1146{
1147
1148        cx231xx_set_model(dev);
1149
1150        dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
1151        if (cx231xx_boards[dev->model].tuner_addr)
1152                dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
1153
1154        /* request some modules */
1155        if (dev->board.decoder == CX231XX_AVDECODER) {
1156                dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1157                                        cx231xx_get_i2c_adap(dev, I2C_0),
1158                                        "cx25840", 0x88 >> 1, NULL);
1159                if (dev->sd_cx25840 == NULL)
1160                        dev_err(dev->dev,
1161                                "cx25840 subdev registration failure\n");
1162                cx25840_call(dev, core, load_fw);
1163
1164        }
1165
1166        /* Initialize the tuner */
1167        if (dev->board.tuner_type != TUNER_ABSENT) {
1168                struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
1169                                                dev->board.tuner_i2c_master);
1170                dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1171                                                    tuner_i2c,
1172                                                    "tuner",
1173                                                    dev->tuner_addr, NULL);
1174                if (dev->sd_tuner == NULL)
1175                        dev_err(dev->dev,
1176                                "tuner subdev registration failure\n");
1177                else
1178                        cx231xx_config_tuner(dev);
1179        }
1180
1181        switch (dev->model) {
1182        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1183        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
1184        case CX231XX_BOARD_HAUPPAUGE_955Q:
1185                {
1186                        struct eeprom {
1187                                struct tveeprom tvee;
1188                                u8 eeprom[256];
1189                                struct i2c_client client;
1190                        };
1191                        struct eeprom *e = kzalloc(sizeof(*e), GFP_KERNEL);
1192
1193                        if (e == NULL) {
1194                                dev_err(dev->dev,
1195                                        "failed to allocate memory to read eeprom\n");
1196                                break;
1197                        }
1198                        e->client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
1199                        e->client.addr = 0xa0 >> 1;
1200
1201                        read_eeprom(dev, &e->client, e->eeprom, sizeof(e->eeprom));
1202                        tveeprom_hauppauge_analog(&e->tvee, e->eeprom + 0xc0);
1203                        kfree(e);
1204                        break;
1205                }
1206        }
1207
1208}
1209
1210/*
1211 * cx231xx_config()
1212 * inits registers with sane defaults
1213 */
1214int cx231xx_config(struct cx231xx *dev)
1215{
1216        /* TBD need to add cx231xx specific code */
1217
1218        return 0;
1219}
1220
1221/*
1222 * cx231xx_config_i2c()
1223 * configure i2c attached devices
1224 */
1225void cx231xx_config_i2c(struct cx231xx *dev)
1226{
1227        /* u32 input = INPUT(dev->video_input)->vmux; */
1228
1229        call_all(dev, video, s_stream, 1);
1230}
1231
1232static void cx231xx_unregister_media_device(struct cx231xx *dev)
1233{
1234#ifdef CONFIG_MEDIA_CONTROLLER
1235        if (dev->media_dev) {
1236                media_device_unregister(dev->media_dev);
1237                media_device_cleanup(dev->media_dev);
1238                kfree(dev->media_dev);
1239                dev->media_dev = NULL;
1240        }
1241#endif
1242}
1243
1244/*
1245 * cx231xx_realease_resources()
1246 * unregisters the v4l2,i2c and usb devices
1247 * called when the device gets disconected or at module unload
1248*/
1249void cx231xx_release_resources(struct cx231xx *dev)
1250{
1251        cx231xx_ir_exit(dev);
1252
1253        cx231xx_release_analog_resources(dev);
1254
1255        cx231xx_remove_from_devlist(dev);
1256
1257        /* Release I2C buses */
1258        cx231xx_dev_uninit(dev);
1259
1260        /* delete v4l2 device */
1261        v4l2_device_unregister(&dev->v4l2_dev);
1262
1263        cx231xx_unregister_media_device(dev);
1264
1265        usb_put_dev(dev->udev);
1266
1267        /* Mark device as unused */
1268        clear_bit(dev->devno, &cx231xx_devused);
1269}
1270
1271static int cx231xx_media_device_init(struct cx231xx *dev,
1272                                      struct usb_device *udev)
1273{
1274#ifdef CONFIG_MEDIA_CONTROLLER
1275        struct media_device *mdev;
1276
1277        mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
1278        if (!mdev)
1279                return -ENOMEM;
1280
1281        media_device_usb_init(mdev, udev, dev->board.name);
1282
1283        dev->media_dev = mdev;
1284#endif
1285        return 0;
1286}
1287
1288/*
1289 * cx231xx_init_dev()
1290 * allocates and inits the device structs, registers i2c bus and v4l device
1291 */
1292static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
1293                            int minor)
1294{
1295        int retval = -ENOMEM;
1296        unsigned int maxh, maxw;
1297
1298        dev->udev = udev;
1299        mutex_init(&dev->lock);
1300        mutex_init(&dev->ctrl_urb_lock);
1301        mutex_init(&dev->gpio_i2c_lock);
1302        mutex_init(&dev->i2c_lock);
1303
1304        spin_lock_init(&dev->video_mode.slock);
1305        spin_lock_init(&dev->vbi_mode.slock);
1306        spin_lock_init(&dev->sliced_cc_mode.slock);
1307
1308        init_waitqueue_head(&dev->open);
1309        init_waitqueue_head(&dev->wait_frame);
1310        init_waitqueue_head(&dev->wait_stream);
1311
1312        dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
1313        dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
1314        dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
1315        dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
1316        dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
1317
1318        /* Query cx231xx to find what pcb config it is related to */
1319        retval = initialize_cx231xx(dev);
1320        if (retval < 0) {
1321                dev_err(dev->dev, "Failed to read PCB config\n");
1322                return retval;
1323        }
1324
1325        /*To workaround error number=-71 on EP0 for VideoGrabber,
1326                 need set alt here.*/
1327        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
1328            dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
1329                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1330                cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
1331        }
1332        /* Cx231xx pre card setup */
1333        cx231xx_pre_card_setup(dev);
1334
1335        retval = cx231xx_config(dev);
1336        if (retval) {
1337                dev_err(dev->dev, "error configuring device\n");
1338                return -ENOMEM;
1339        }
1340
1341        /* set default norm */
1342        dev->norm = dev->board.norm;
1343
1344        /* register i2c bus */
1345        retval = cx231xx_dev_init(dev);
1346        if (retval) {
1347                dev_err(dev->dev,
1348                        "%s: cx231xx_i2c_register - errCode [%d]!\n",
1349                        __func__, retval);
1350                goto err_dev_init;
1351        }
1352
1353        /* Do board specific init */
1354        cx231xx_card_setup(dev);
1355
1356        /* configure the device */
1357        cx231xx_config_i2c(dev);
1358
1359        maxw = norm_maxw(dev);
1360        maxh = norm_maxh(dev);
1361
1362        /* set default image size */
1363        dev->width = maxw;
1364        dev->height = maxh;
1365        dev->interlaced = 0;
1366        dev->video_input = 0;
1367
1368        retval = cx231xx_config(dev);
1369        if (retval) {
1370                dev_err(dev->dev, "%s: cx231xx_config - errCode [%d]!\n",
1371                        __func__, retval);
1372                goto err_dev_init;
1373        }
1374
1375        /* init video dma queues */
1376        INIT_LIST_HEAD(&dev->video_mode.vidq.active);
1377        INIT_LIST_HEAD(&dev->video_mode.vidq.queued);
1378
1379        /* init vbi dma queues */
1380        INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
1381        INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
1382
1383        /* Reset other chips required if they are tied up with GPIO pins */
1384        cx231xx_add_into_devlist(dev);
1385
1386        if (dev->board.has_417) {
1387                dev_info(dev->dev, "attach 417 %d\n", dev->model);
1388                if (cx231xx_417_register(dev) < 0) {
1389                        dev_err(dev->dev,
1390                                "%s() Failed to register 417 on VID_B\n",
1391                                __func__);
1392                }
1393        }
1394
1395        retval = cx231xx_register_analog_devices(dev);
1396        if (retval)
1397                goto err_analog;
1398
1399        cx231xx_ir_init(dev);
1400
1401        cx231xx_init_extension(dev);
1402
1403        return 0;
1404err_analog:
1405        cx231xx_unregister_media_device(dev);
1406        cx231xx_release_analog_resources(dev);
1407        cx231xx_remove_from_devlist(dev);
1408err_dev_init:
1409        cx231xx_dev_uninit(dev);
1410        return retval;
1411}
1412
1413#if defined(CONFIG_MODULES) && defined(MODULE)
1414static void request_module_async(struct work_struct *work)
1415{
1416        struct cx231xx *dev = container_of(work,
1417                                           struct cx231xx, request_module_wk);
1418
1419        if (dev->has_alsa_audio)
1420                request_module("cx231xx-alsa");
1421
1422        if (dev->board.has_dvb)
1423                request_module("cx231xx-dvb");
1424
1425}
1426
1427static void request_modules(struct cx231xx *dev)
1428{
1429        INIT_WORK(&dev->request_module_wk, request_module_async);
1430        schedule_work(&dev->request_module_wk);
1431}
1432
1433static void flush_request_modules(struct cx231xx *dev)
1434{
1435        flush_work(&dev->request_module_wk);
1436}
1437#else
1438#define request_modules(dev)
1439#define flush_request_modules(dev)
1440#endif /* CONFIG_MODULES */
1441
1442static int cx231xx_init_v4l2(struct cx231xx *dev,
1443                             struct usb_device *udev,
1444                             struct usb_interface *interface,
1445                             int isoc_pipe)
1446{
1447        struct usb_interface *uif;
1448        int i, idx;
1449
1450        /* Video Init */
1451
1452        /* compute alternate max packet sizes for video */
1453        idx = dev->current_pcb_config.hs_config_info[0].interface_info.video_index + 1;
1454        if (idx >= dev->max_iad_interface_count) {
1455                dev_err(dev->dev,
1456                        "Video PCB interface #%d doesn't exist\n", idx);
1457                return -ENODEV;
1458        }
1459
1460        uif = udev->actconfig->interface[idx];
1461
1462        if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1463                return -ENODEV;
1464
1465        dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;
1466        dev->video_mode.num_alt = uif->num_altsetting;
1467
1468        dev_info(dev->dev,
1469                 "video EndPoint Addr 0x%x, Alternate settings: %i\n",
1470                 dev->video_mode.end_point_addr,
1471                 dev->video_mode.num_alt);
1472
1473        dev->video_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->video_mode.num_alt, GFP_KERNEL);
1474        if (dev->video_mode.alt_max_pkt_size == NULL)
1475                return -ENOMEM;
1476
1477        for (i = 0; i < dev->video_mode.num_alt; i++) {
1478                u16 tmp;
1479
1480                if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1481                        return -ENODEV;
1482
1483                tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
1484                dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1485                dev_dbg(dev->dev,
1486                        "Alternate setting %i, max size= %i\n", i,
1487                        dev->video_mode.alt_max_pkt_size[i]);
1488        }
1489
1490        /* VBI Init */
1491
1492        idx = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index + 1;
1493        if (idx >= dev->max_iad_interface_count) {
1494                dev_err(dev->dev,
1495                        "VBI PCB interface #%d doesn't exist\n", idx);
1496                return -ENODEV;
1497        }
1498        uif = udev->actconfig->interface[idx];
1499
1500        if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1501                return -ENODEV;
1502
1503        dev->vbi_mode.end_point_addr =
1504            uif->altsetting[0].endpoint[isoc_pipe].desc.
1505                        bEndpointAddress;
1506
1507        dev->vbi_mode.num_alt = uif->num_altsetting;
1508        dev_info(dev->dev,
1509                 "VBI EndPoint Addr 0x%x, Alternate settings: %i\n",
1510                 dev->vbi_mode.end_point_addr,
1511                 dev->vbi_mode.num_alt);
1512
1513        /* compute alternate max packet sizes for vbi */
1514        dev->vbi_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->vbi_mode.num_alt, GFP_KERNEL);
1515        if (dev->vbi_mode.alt_max_pkt_size == NULL)
1516                return -ENOMEM;
1517
1518        for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1519                u16 tmp;
1520
1521                if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1522                        return -ENODEV;
1523
1524                tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1525                                desc.wMaxPacketSize);
1526                dev->vbi_mode.alt_max_pkt_size[i] =
1527                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1528                dev_dbg(dev->dev,
1529                        "Alternate setting %i, max size= %i\n", i,
1530                        dev->vbi_mode.alt_max_pkt_size[i]);
1531        }
1532
1533        /* Sliced CC VBI init */
1534
1535        /* compute alternate max packet sizes for sliced CC */
1536        idx = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index + 1;
1537        if (idx >= dev->max_iad_interface_count) {
1538                dev_err(dev->dev,
1539                        "Sliced CC PCB interface #%d doesn't exist\n", idx);
1540                return -ENODEV;
1541        }
1542        uif = udev->actconfig->interface[idx];
1543
1544        if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1545                return -ENODEV;
1546
1547        dev->sliced_cc_mode.end_point_addr =
1548            uif->altsetting[0].endpoint[isoc_pipe].desc.
1549                        bEndpointAddress;
1550
1551        dev->sliced_cc_mode.num_alt = uif->num_altsetting;
1552        dev_info(dev->dev,
1553                 "sliced CC EndPoint Addr 0x%x, Alternate settings: %i\n",
1554                 dev->sliced_cc_mode.end_point_addr,
1555                 dev->sliced_cc_mode.num_alt);
1556        dev->sliced_cc_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->sliced_cc_mode.num_alt, GFP_KERNEL);
1557        if (dev->sliced_cc_mode.alt_max_pkt_size == NULL)
1558                return -ENOMEM;
1559
1560        for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1561                u16 tmp;
1562
1563                if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1564                        return -ENODEV;
1565
1566                tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1567                                desc.wMaxPacketSize);
1568                dev->sliced_cc_mode.alt_max_pkt_size[i] =
1569                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1570                dev_dbg(dev->dev,
1571                        "Alternate setting %i, max size= %i\n", i,
1572                        dev->sliced_cc_mode.alt_max_pkt_size[i]);
1573        }
1574
1575        return 0;
1576}
1577
1578/*
1579 * cx231xx_usb_probe()
1580 * checks for supported devices
1581 */
1582static int cx231xx_usb_probe(struct usb_interface *interface,
1583                             const struct usb_device_id *id)
1584{
1585        struct usb_device *udev;
1586        struct device *d = &interface->dev;
1587        struct usb_interface *uif;
1588        struct cx231xx *dev = NULL;
1589        int retval = -ENODEV;
1590        int nr = 0, ifnum;
1591        int i, isoc_pipe = 0;
1592        char *speed;
1593        u8 idx;
1594        struct usb_interface_assoc_descriptor *assoc_desc;
1595
1596        ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1597
1598        /*
1599         * Interface number 0 - IR interface (handled by mceusb driver)
1600         * Interface number 1 - AV interface (handled by this driver)
1601         */
1602        if (ifnum != 1)
1603                return -ENODEV;
1604
1605        /* Check to see next free device and mark as used */
1606        do {
1607                nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
1608                if (nr >= CX231XX_MAXBOARDS) {
1609                        /* No free device slots */
1610                        dev_err(d,
1611                                "Supports only %i devices.\n",
1612                                CX231XX_MAXBOARDS);
1613                        return -ENOMEM;
1614                }
1615        } while (test_and_set_bit(nr, &cx231xx_devused));
1616
1617        udev = usb_get_dev(interface_to_usbdev(interface));
1618
1619        /* allocate memory for our device state and initialize it */
1620        dev = devm_kzalloc(&udev->dev, sizeof(*dev), GFP_KERNEL);
1621        if (dev == NULL) {
1622                retval = -ENOMEM;
1623                goto err_if;
1624        }
1625
1626        snprintf(dev->name, 29, "cx231xx #%d", nr);
1627        dev->devno = nr;
1628        dev->model = id->driver_info;
1629        dev->video_mode.alt = -1;
1630        dev->dev = d;
1631
1632        cx231xx_set_model(dev);
1633
1634        dev->interface_count++;
1635        /* reset gpio dir and value */
1636        dev->gpio_dir = 0;
1637        dev->gpio_val = 0;
1638        dev->xc_fw_load_done = 0;
1639        dev->has_alsa_audio = 1;
1640        dev->power_mode = -1;
1641        atomic_set(&dev->devlist_count, 0);
1642
1643        /* 0 - vbi ; 1 -sliced cc mode */
1644        dev->vbi_or_sliced_cc_mode = 0;
1645
1646        /* get maximum no.of IAD interfaces */
1647        dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;
1648
1649        /* init CIR module TBD */
1650
1651        /*mode_tv: digital=1 or analog=0*/
1652        dev->mode_tv = 0;
1653
1654        dev->USE_ISO = transfer_mode;
1655
1656        switch (udev->speed) {
1657        case USB_SPEED_LOW:
1658                speed = "1.5";
1659                break;
1660        case USB_SPEED_UNKNOWN:
1661        case USB_SPEED_FULL:
1662                speed = "12";
1663                break;
1664        case USB_SPEED_HIGH:
1665                speed = "480";
1666                break;
1667        default:
1668                speed = "unknown";
1669        }
1670
1671        dev_info(d,
1672                 "New device %s %s @ %s Mbps (%04x:%04x) with %d interfaces\n",
1673                 udev->manufacturer ? udev->manufacturer : "",
1674                 udev->product ? udev->product : "",
1675                 speed,
1676                 le16_to_cpu(udev->descriptor.idVendor),
1677                 le16_to_cpu(udev->descriptor.idProduct),
1678                 dev->max_iad_interface_count);
1679
1680        /* increment interface count */
1681        dev->interface_count++;
1682
1683        /* get device number */
1684        nr = dev->devno;
1685
1686        assoc_desc = udev->actconfig->intf_assoc[0];
1687        if (assoc_desc->bFirstInterface != ifnum) {
1688                dev_err(d, "Not found matching IAD interface\n");
1689                retval = -ENODEV;
1690                goto err_if;
1691        }
1692
1693        dev_dbg(d, "registering interface %d\n", ifnum);
1694
1695        /* save our data pointer in this interface device */
1696        usb_set_intfdata(interface, dev);
1697
1698        /* Initialize the media controller */
1699        retval = cx231xx_media_device_init(dev, udev);
1700        if (retval) {
1701                dev_err(d, "cx231xx_media_device_init failed\n");
1702                goto err_media_init;
1703        }
1704
1705        /* Create v4l2 device */
1706#ifdef CONFIG_MEDIA_CONTROLLER
1707        dev->v4l2_dev.mdev = dev->media_dev;
1708#endif
1709        retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
1710        if (retval) {
1711                dev_err(d, "v4l2_device_register failed\n");
1712                goto err_v4l2;
1713        }
1714
1715        /* allocate device struct */
1716        retval = cx231xx_init_dev(dev, udev, nr);
1717        if (retval)
1718                goto err_init;
1719
1720        retval = cx231xx_init_v4l2(dev, udev, interface, isoc_pipe);
1721        if (retval)
1722                goto err_init;
1723
1724        if (dev->current_pcb_config.ts1_source != 0xff) {
1725                /* compute alternate max packet sizes for TS1 */
1726                idx = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index + 1;
1727                if (idx >= dev->max_iad_interface_count) {
1728                        dev_err(d, "TS1 PCB interface #%d doesn't exist\n",
1729                                idx);
1730                        retval = -ENODEV;
1731                        goto err_video_alt;
1732                }
1733                uif = udev->actconfig->interface[idx];
1734
1735                if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1) {
1736                        retval = -ENODEV;
1737                        goto err_video_alt;
1738                }
1739
1740                dev->ts1_mode.end_point_addr =
1741                    uif->altsetting[0].endpoint[isoc_pipe].
1742                                desc.bEndpointAddress;
1743
1744                dev->ts1_mode.num_alt = uif->num_altsetting;
1745                dev_info(d,
1746                         "TS EndPoint Addr 0x%x, Alternate settings: %i\n",
1747                         dev->ts1_mode.end_point_addr,
1748                         dev->ts1_mode.num_alt);
1749
1750                dev->ts1_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->ts1_mode.num_alt, GFP_KERNEL);
1751                if (dev->ts1_mode.alt_max_pkt_size == NULL) {
1752                        retval = -ENOMEM;
1753                        goto err_video_alt;
1754                }
1755
1756                for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1757                        u16 tmp;
1758
1759                        if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1) {
1760                                retval = -ENODEV;
1761                                goto err_video_alt;
1762                        }
1763
1764                        tmp = le16_to_cpu(uif->altsetting[i].
1765                                                endpoint[isoc_pipe].desc.
1766                                                wMaxPacketSize);
1767                        dev->ts1_mode.alt_max_pkt_size[i] =
1768                            (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1769                        dev_dbg(d, "Alternate setting %i, max size= %i\n",
1770                                i, dev->ts1_mode.alt_max_pkt_size[i]);
1771                }
1772        }
1773
1774        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1775                cx231xx_enable_OSC(dev);
1776                cx231xx_reset_out(dev);
1777                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1778        }
1779
1780        if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
1781                cx231xx_sleep_s5h1432(dev);
1782
1783        /* load other modules required */
1784        request_modules(dev);
1785
1786#ifdef CONFIG_MEDIA_CONTROLLER
1787        /* Init entities at the Media Controller */
1788        cx231xx_v4l2_create_entities(dev);
1789
1790        retval = v4l2_mc_create_media_graph(dev->media_dev);
1791        if (!retval)
1792                retval = media_device_register(dev->media_dev);
1793#endif
1794        if (retval < 0)
1795                cx231xx_release_resources(dev);
1796        return retval;
1797
1798err_video_alt:
1799        /* cx231xx_uninit_dev: */
1800        cx231xx_close_extension(dev);
1801        cx231xx_ir_exit(dev);
1802        cx231xx_release_analog_resources(dev);
1803        cx231xx_417_unregister(dev);
1804        cx231xx_remove_from_devlist(dev);
1805        cx231xx_dev_uninit(dev);
1806err_init:
1807        v4l2_device_unregister(&dev->v4l2_dev);
1808err_v4l2:
1809        cx231xx_unregister_media_device(dev);
1810err_media_init:
1811        usb_set_intfdata(interface, NULL);
1812err_if:
1813        usb_put_dev(udev);
1814        clear_bit(nr, &cx231xx_devused);
1815        return retval;
1816}
1817
1818/*
1819 * cx231xx_usb_disconnect()
1820 * called when the device gets diconencted
1821 * video device will be unregistered on v4l2_close in case it is still open
1822 */
1823static void cx231xx_usb_disconnect(struct usb_interface *interface)
1824{
1825        struct cx231xx *dev;
1826
1827        dev = usb_get_intfdata(interface);
1828        usb_set_intfdata(interface, NULL);
1829
1830        if (!dev)
1831                return;
1832
1833        if (!dev->udev)
1834                return;
1835
1836        dev->state |= DEV_DISCONNECTED;
1837
1838        flush_request_modules(dev);
1839
1840        /* wait until all current v4l2 io is finished then deallocate
1841           resources */
1842        mutex_lock(&dev->lock);
1843
1844        wake_up_interruptible_all(&dev->open);
1845
1846        if (dev->users) {
1847                dev_warn(dev->dev,
1848                         "device %s is open! Deregistration and memory deallocation are deferred on close.\n",
1849                         video_device_node_name(&dev->vdev));
1850
1851                /* Even having users, it is safe to remove the RC i2c driver */
1852                cx231xx_ir_exit(dev);
1853
1854                if (dev->USE_ISO)
1855                        cx231xx_uninit_isoc(dev);
1856                else
1857                        cx231xx_uninit_bulk(dev);
1858                wake_up_interruptible(&dev->wait_frame);
1859                wake_up_interruptible(&dev->wait_stream);
1860        } else {
1861        }
1862
1863        cx231xx_close_extension(dev);
1864
1865        mutex_unlock(&dev->lock);
1866
1867        if (!dev->users)
1868                cx231xx_release_resources(dev);
1869}
1870
1871static struct usb_driver cx231xx_usb_driver = {
1872        .name = "cx231xx",
1873        .probe = cx231xx_usb_probe,
1874        .disconnect = cx231xx_usb_disconnect,
1875        .id_table = cx231xx_id_table,
1876};
1877
1878module_usb_driver(cx231xx_usb_driver);
1879