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