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 <linux/init.h>
  24#include <linux/module.h>
  25#include <linux/slab.h>
  26#include <linux/delay.h>
  27#include <linux/i2c.h>
  28#include <linux/usb.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#include "cx231xx.h"
  39
  40static int tuner = -1;
  41module_param(tuner, int, 0444);
  42MODULE_PARM_DESC(tuner, "tuner type");
  43
  44static int transfer_mode = 1;
  45module_param(transfer_mode, int, 0444);
  46MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");
  47
  48static unsigned int disable_ir;
  49module_param(disable_ir, int, 0444);
  50MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
  51
  52/* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
  53static unsigned long cx231xx_devused;
  54
  55/*
  56 *  Reset sequences for analog/digital modes
  57 */
  58
  59static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
  60        {0x03, 0x01, 10},
  61        {0x03, 0x00, 30},
  62        {0x03, 0x01, 10},
  63        {-1, -1, -1},
  64};
  65
  66/*
  67 *  Board definitions
  68 */
  69struct cx231xx_board cx231xx_boards[] = {
  70        [CX231XX_BOARD_UNKNOWN] = {
  71                .name = "Unknown CX231xx video grabber",
  72                .tuner_type = TUNER_ABSENT,
  73                .input = {{
  74                                .type = CX231XX_VMUX_TELEVISION,
  75                                .vmux = CX231XX_VIN_3_1,
  76                                .amux = CX231XX_AMUX_VIDEO,
  77                                .gpio = NULL,
  78                        }, {
  79                                .type = CX231XX_VMUX_COMPOSITE1,
  80                                .vmux = CX231XX_VIN_2_1,
  81                                .amux = CX231XX_AMUX_LINE_IN,
  82                                .gpio = NULL,
  83                        }, {
  84                                .type = CX231XX_VMUX_SVIDEO,
  85                                .vmux = CX231XX_VIN_1_1 |
  86                                        (CX231XX_VIN_1_2 << 8) |
  87                                        CX25840_SVIDEO_ON,
  88                                .amux = CX231XX_AMUX_LINE_IN,
  89                                .gpio = NULL,
  90                        }
  91                },
  92        },
  93        [CX231XX_BOARD_CNXT_CARRAERA] = {
  94                .name = "Conexant Hybrid TV - CARRAERA",
  95                .tuner_type = TUNER_XC5000,
  96                .tuner_addr = 0x61,
  97                .tuner_gpio = RDE250_XCV_TUNER,
  98                .tuner_sif_gpio = 0x05,
  99                .tuner_scl_gpio = 0x1a,
 100                .tuner_sda_gpio = 0x1b,
 101                .decoder = CX231XX_AVDECODER,
 102                .output_mode = OUT_MODE_VIP11,
 103                .demod_xfer_mode = 0,
 104                .ctl_pin_status_mask = 0xFFFFFFC4,
 105                .agc_analog_digital_select_gpio = 0x0c,
 106                .gpio_pin_status_mask = 0x4001000,
 107                .tuner_i2c_master = 1,
 108                .demod_i2c_master = 2,
 109                .has_dvb = 1,
 110                .demod_addr = 0x02,
 111                .norm = V4L2_STD_PAL,
 112
 113                .input = {{
 114                                .type = CX231XX_VMUX_TELEVISION,
 115                                .vmux = CX231XX_VIN_3_1,
 116                                .amux = CX231XX_AMUX_VIDEO,
 117                                .gpio = NULL,
 118                        }, {
 119                                .type = CX231XX_VMUX_COMPOSITE1,
 120                                .vmux = CX231XX_VIN_2_1,
 121                                .amux = CX231XX_AMUX_LINE_IN,
 122                                .gpio = NULL,
 123                        }, {
 124                                .type = CX231XX_VMUX_SVIDEO,
 125                                .vmux = CX231XX_VIN_1_1 |
 126                                        (CX231XX_VIN_1_2 << 8) |
 127                                        CX25840_SVIDEO_ON,
 128                                .amux = CX231XX_AMUX_LINE_IN,
 129                                .gpio = NULL,
 130                        }
 131                },
 132        },
 133        [CX231XX_BOARD_CNXT_SHELBY] = {
 134                .name = "Conexant Hybrid TV - SHELBY",
 135                .tuner_type = TUNER_XC5000,
 136                .tuner_addr = 0x61,
 137                .tuner_gpio = RDE250_XCV_TUNER,
 138                .tuner_sif_gpio = 0x05,
 139                .tuner_scl_gpio = 0x1a,
 140                .tuner_sda_gpio = 0x1b,
 141                .decoder = CX231XX_AVDECODER,
 142                .output_mode = OUT_MODE_VIP11,
 143                .demod_xfer_mode = 0,
 144                .ctl_pin_status_mask = 0xFFFFFFC4,
 145                .agc_analog_digital_select_gpio = 0x0c,
 146                .gpio_pin_status_mask = 0x4001000,
 147                .tuner_i2c_master = 1,
 148                .demod_i2c_master = 2,
 149                .has_dvb = 1,
 150                .demod_addr = 0x32,
 151                .norm = V4L2_STD_NTSC,
 152
 153                .input = {{
 154                                .type = CX231XX_VMUX_TELEVISION,
 155                                .vmux = CX231XX_VIN_3_1,
 156                                .amux = CX231XX_AMUX_VIDEO,
 157                                .gpio = NULL,
 158                        }, {
 159                                .type = CX231XX_VMUX_COMPOSITE1,
 160                                .vmux = CX231XX_VIN_2_1,
 161                                .amux = CX231XX_AMUX_LINE_IN,
 162                                .gpio = NULL,
 163                        }, {
 164                                .type = CX231XX_VMUX_SVIDEO,
 165                                .vmux = CX231XX_VIN_1_1 |
 166                                        (CX231XX_VIN_1_2 << 8) |
 167                                        CX25840_SVIDEO_ON,
 168                                .amux = CX231XX_AMUX_LINE_IN,
 169                                .gpio = NULL,
 170                        }
 171                },
 172        },
 173        [CX231XX_BOARD_CNXT_RDE_253S] = {
 174                .name = "Conexant Hybrid TV - RDE253S",
 175                .tuner_type = TUNER_NXP_TDA18271,
 176                .tuner_addr = 0x60,
 177                .tuner_gpio = RDE250_XCV_TUNER,
 178                .tuner_sif_gpio = 0x05,
 179                .tuner_scl_gpio = 0x1a,
 180                .tuner_sda_gpio = 0x1b,
 181                .decoder = CX231XX_AVDECODER,
 182                .output_mode = OUT_MODE_VIP11,
 183                .demod_xfer_mode = 0,
 184                .ctl_pin_status_mask = 0xFFFFFFC4,
 185                .agc_analog_digital_select_gpio = 0x1c,
 186                .gpio_pin_status_mask = 0x4001000,
 187                .tuner_i2c_master = 1,
 188                .demod_i2c_master = 2,
 189                .has_dvb = 1,
 190                .demod_addr = 0x02,
 191                .norm = V4L2_STD_PAL,
 192
 193                .input = {{
 194                                .type = CX231XX_VMUX_TELEVISION,
 195                                .vmux = CX231XX_VIN_3_1,
 196                                .amux = CX231XX_AMUX_VIDEO,
 197                                .gpio = NULL,
 198                        }, {
 199                                .type = CX231XX_VMUX_COMPOSITE1,
 200                                .vmux = CX231XX_VIN_2_1,
 201                                .amux = CX231XX_AMUX_LINE_IN,
 202                                .gpio = NULL,
 203                        }, {
 204                                .type = CX231XX_VMUX_SVIDEO,
 205                                .vmux = CX231XX_VIN_1_1 |
 206                                        (CX231XX_VIN_1_2 << 8) |
 207                                        CX25840_SVIDEO_ON,
 208                                .amux = CX231XX_AMUX_LINE_IN,
 209                                .gpio = NULL,
 210                        }
 211                },
 212        },
 213
 214        [CX231XX_BOARD_CNXT_RDU_253S] = {
 215                .name = "Conexant Hybrid TV - RDU253S",
 216                .tuner_type = TUNER_NXP_TDA18271,
 217                .tuner_addr = 0x60,
 218                .tuner_gpio = RDE250_XCV_TUNER,
 219                .tuner_sif_gpio = 0x05,
 220                .tuner_scl_gpio = 0x1a,
 221                .tuner_sda_gpio = 0x1b,
 222                .decoder = CX231XX_AVDECODER,
 223                .output_mode = OUT_MODE_VIP11,
 224                .demod_xfer_mode = 0,
 225                .ctl_pin_status_mask = 0xFFFFFFC4,
 226                .agc_analog_digital_select_gpio = 0x1c,
 227                .gpio_pin_status_mask = 0x4001000,
 228                .tuner_i2c_master = 1,
 229                .demod_i2c_master = 2,
 230                .has_dvb = 1,
 231                .demod_addr = 0x02,
 232                .norm = V4L2_STD_PAL,
 233
 234                .input = {{
 235                                .type = CX231XX_VMUX_TELEVISION,
 236                                .vmux = CX231XX_VIN_3_1,
 237                                .amux = CX231XX_AMUX_VIDEO,
 238                                .gpio = NULL,
 239                        }, {
 240                                .type = CX231XX_VMUX_COMPOSITE1,
 241                                .vmux = CX231XX_VIN_2_1,
 242                                .amux = CX231XX_AMUX_LINE_IN,
 243                                .gpio = NULL,
 244                        }, {
 245                                .type = CX231XX_VMUX_SVIDEO,
 246                                .vmux = CX231XX_VIN_1_1 |
 247                                        (CX231XX_VIN_1_2 << 8) |
 248                                        CX25840_SVIDEO_ON,
 249                                .amux = CX231XX_AMUX_LINE_IN,
 250                                .gpio = NULL,
 251                        }
 252                },
 253        },
 254        [CX231XX_BOARD_CNXT_VIDEO_GRABBER] = {
 255                .name = "Conexant VIDEO GRABBER",
 256                .tuner_type = TUNER_ABSENT,
 257                .decoder = CX231XX_AVDECODER,
 258                .output_mode = OUT_MODE_VIP11,
 259                .ctl_pin_status_mask = 0xFFFFFFC4,
 260                .agc_analog_digital_select_gpio = 0x1c,
 261                .gpio_pin_status_mask = 0x4001000,
 262                .norm = V4L2_STD_PAL,
 263                .no_alt_vanc = 1,
 264                .external_av = 1,
 265                .dont_use_port_3 = 1,
 266                /* Actually, it has a 417, but it isn't working correctly.
 267                 * So set to 0 for now until someone can manage to get this
 268                 * to work reliably. */
 269                .has_417 = 0,
 270
 271                .input = {{
 272                                .type = CX231XX_VMUX_COMPOSITE1,
 273                                .vmux = CX231XX_VIN_2_1,
 274                                .amux = CX231XX_AMUX_LINE_IN,
 275                                .gpio = NULL,
 276                        }, {
 277                                .type = CX231XX_VMUX_SVIDEO,
 278                                .vmux = CX231XX_VIN_1_1 |
 279                                        (CX231XX_VIN_1_2 << 8) |
 280                                        CX25840_SVIDEO_ON,
 281                                .amux = CX231XX_AMUX_LINE_IN,
 282                                .gpio = NULL,
 283                        }
 284                },
 285        },
 286        [CX231XX_BOARD_CNXT_RDE_250] = {
 287                .name = "Conexant Hybrid TV - rde 250",
 288                .tuner_type = TUNER_XC5000,
 289                .tuner_addr = 0x61,
 290                .tuner_gpio = RDE250_XCV_TUNER,
 291                .tuner_sif_gpio = 0x05,
 292                .tuner_scl_gpio = 0x1a,
 293                .tuner_sda_gpio = 0x1b,
 294                .decoder = CX231XX_AVDECODER,
 295                .output_mode = OUT_MODE_VIP11,
 296                .demod_xfer_mode = 0,
 297                .ctl_pin_status_mask = 0xFFFFFFC4,
 298                .agc_analog_digital_select_gpio = 0x0c,
 299                .gpio_pin_status_mask = 0x4001000,
 300                .tuner_i2c_master = 1,
 301                .demod_i2c_master = 2,
 302                .has_dvb = 1,
 303                .demod_addr = 0x02,
 304                .norm = V4L2_STD_PAL,
 305
 306                .input = {{
 307                                .type = CX231XX_VMUX_TELEVISION,
 308                                .vmux = CX231XX_VIN_2_1,
 309                                .amux = CX231XX_AMUX_VIDEO,
 310                                .gpio = NULL,
 311                        }
 312                },
 313        },
 314        [CX231XX_BOARD_CNXT_RDU_250] = {
 315                .name = "Conexant Hybrid TV - RDU 250",
 316                .tuner_type = TUNER_XC5000,
 317                .tuner_addr = 0x61,
 318                .tuner_gpio = RDE250_XCV_TUNER,
 319                .tuner_sif_gpio = 0x05,
 320                .tuner_scl_gpio = 0x1a,
 321                .tuner_sda_gpio = 0x1b,
 322                .decoder = CX231XX_AVDECODER,
 323                .output_mode = OUT_MODE_VIP11,
 324                .demod_xfer_mode = 0,
 325                .ctl_pin_status_mask = 0xFFFFFFC4,
 326                .agc_analog_digital_select_gpio = 0x0c,
 327                .gpio_pin_status_mask = 0x4001000,
 328                .tuner_i2c_master = 1,
 329                .demod_i2c_master = 2,
 330                .has_dvb = 1,
 331                .demod_addr = 0x32,
 332                .norm = V4L2_STD_NTSC,
 333
 334                .input = {{
 335                                .type = CX231XX_VMUX_TELEVISION,
 336                                .vmux = CX231XX_VIN_2_1,
 337                                .amux = CX231XX_AMUX_VIDEO,
 338                                .gpio = NULL,
 339                        }
 340                },
 341        },
 342        [CX231XX_BOARD_HAUPPAUGE_EXETER] = {
 343                .name = "Hauppauge EXETER",
 344                .tuner_type = TUNER_NXP_TDA18271,
 345                .tuner_addr = 0x60,
 346                .tuner_gpio = RDE250_XCV_TUNER,
 347                .tuner_sif_gpio = 0x05,
 348                .tuner_scl_gpio = 0x1a,
 349                .tuner_sda_gpio = 0x1b,
 350                .decoder = CX231XX_AVDECODER,
 351                .output_mode = OUT_MODE_VIP11,
 352                .demod_xfer_mode = 0,
 353                .ctl_pin_status_mask = 0xFFFFFFC4,
 354                .agc_analog_digital_select_gpio = 0x0c,
 355                .gpio_pin_status_mask = 0x4001000,
 356                .tuner_i2c_master = 1,
 357                .demod_i2c_master = 2,
 358                .has_dvb = 1,
 359                .demod_addr = 0x0e,
 360                .norm = V4L2_STD_NTSC,
 361
 362                .input = {{
 363                        .type = CX231XX_VMUX_TELEVISION,
 364                        .vmux = CX231XX_VIN_3_1,
 365                        .amux = CX231XX_AMUX_VIDEO,
 366                        .gpio = NULL,
 367                }, {
 368                        .type = CX231XX_VMUX_COMPOSITE1,
 369                        .vmux = CX231XX_VIN_2_1,
 370                        .amux = CX231XX_AMUX_LINE_IN,
 371                        .gpio = NULL,
 372                }, {
 373                        .type = CX231XX_VMUX_SVIDEO,
 374                        .vmux = CX231XX_VIN_1_1 |
 375                                (CX231XX_VIN_1_2 << 8) |
 376                                CX25840_SVIDEO_ON,
 377                        .amux = CX231XX_AMUX_LINE_IN,
 378                        .gpio = NULL,
 379                } },
 380        },
 381        [CX231XX_BOARD_HAUPPAUGE_USBLIVE2] = {
 382                .name = "Hauppauge USB Live 2",
 383                .tuner_type = TUNER_ABSENT,
 384                .decoder = CX231XX_AVDECODER,
 385                .output_mode = OUT_MODE_VIP11,
 386                .demod_xfer_mode = 0,
 387                .ctl_pin_status_mask = 0xFFFFFFC4,
 388                .agc_analog_digital_select_gpio = 0x0c,
 389                .gpio_pin_status_mask = 0x4001000,
 390                .norm = V4L2_STD_NTSC,
 391                .no_alt_vanc = 1,
 392                .external_av = 1,
 393                .dont_use_port_3 = 1,
 394                .input = {{
 395                        .type = CX231XX_VMUX_COMPOSITE1,
 396                        .vmux = CX231XX_VIN_2_1,
 397                        .amux = CX231XX_AMUX_LINE_IN,
 398                        .gpio = NULL,
 399                }, {
 400                        .type = CX231XX_VMUX_SVIDEO,
 401                        .vmux = CX231XX_VIN_1_1 |
 402                                (CX231XX_VIN_1_2 << 8) |
 403                                CX25840_SVIDEO_ON,
 404                        .amux = CX231XX_AMUX_LINE_IN,
 405                        .gpio = NULL,
 406                } },
 407        },
 408        [CX231XX_BOARD_KWORLD_UB430_USB_HYBRID] = {
 409                .name = "Kworld UB430 USB Hybrid",
 410                .tuner_type = TUNER_NXP_TDA18271,
 411                .tuner_addr = 0x60,
 412                .decoder = CX231XX_AVDECODER,
 413                .output_mode = OUT_MODE_VIP11,
 414                .demod_xfer_mode = 0,
 415                .ctl_pin_status_mask = 0xFFFFFFC4,
 416                .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
 417                .tuner_sif_gpio = -1,
 418                .tuner_scl_gpio = -1,
 419                .tuner_sda_gpio = -1,
 420                .gpio_pin_status_mask = 0x4001000,
 421                .tuner_i2c_master = 2,
 422                .demod_i2c_master = 1,
 423                .ir_i2c_master = 2,
 424                .has_dvb = 1,
 425                .demod_addr = 0x10,
 426                .norm = V4L2_STD_PAL_M,
 427                .input = {{
 428                        .type = CX231XX_VMUX_TELEVISION,
 429                        .vmux = CX231XX_VIN_3_1,
 430                        .amux = CX231XX_AMUX_VIDEO,
 431                        .gpio = NULL,
 432                }, {
 433                        .type = CX231XX_VMUX_COMPOSITE1,
 434                        .vmux = CX231XX_VIN_2_1,
 435                        .amux = CX231XX_AMUX_LINE_IN,
 436                        .gpio = NULL,
 437                }, {
 438                        .type = CX231XX_VMUX_SVIDEO,
 439                        .vmux = CX231XX_VIN_1_1 |
 440                                (CX231XX_VIN_1_2 << 8) |
 441                                CX25840_SVIDEO_ON,
 442                        .amux = CX231XX_AMUX_LINE_IN,
 443                        .gpio = NULL,
 444                } },
 445        },
 446        [CX231XX_BOARD_KWORLD_UB445_USB_HYBRID] = {
 447                .name = "Kworld UB445 USB Hybrid",
 448                .tuner_type = TUNER_NXP_TDA18271,
 449                .tuner_addr = 0x60,
 450                .decoder = CX231XX_AVDECODER,
 451                .output_mode = OUT_MODE_VIP11,
 452                .demod_xfer_mode = 0,
 453                .ctl_pin_status_mask = 0xFFFFFFC4,
 454                .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
 455                .tuner_sif_gpio = -1,
 456                .tuner_scl_gpio = -1,
 457                .tuner_sda_gpio = -1,
 458                .gpio_pin_status_mask = 0x4001000,
 459                .tuner_i2c_master = 2,
 460                .demod_i2c_master = 1,
 461                .ir_i2c_master = 2,
 462                .has_dvb = 1,
 463                .demod_addr = 0x10,
 464                .norm = V4L2_STD_NTSC_M,
 465                .input = {{
 466                        .type = CX231XX_VMUX_TELEVISION,
 467                        .vmux = CX231XX_VIN_3_1,
 468                        .amux = CX231XX_AMUX_VIDEO,
 469                        .gpio = NULL,
 470                }, {
 471                        .type = CX231XX_VMUX_COMPOSITE1,
 472                        .vmux = CX231XX_VIN_2_1,
 473                        .amux = CX231XX_AMUX_LINE_IN,
 474                        .gpio = NULL,
 475                }, {
 476                        .type = CX231XX_VMUX_SVIDEO,
 477                        .vmux = CX231XX_VIN_1_1 |
 478                                (CX231XX_VIN_1_2 << 8) |
 479                                CX25840_SVIDEO_ON,
 480                        .amux = CX231XX_AMUX_LINE_IN,
 481                        .gpio = NULL,
 482                } },
 483        },
 484        [CX231XX_BOARD_PV_PLAYTV_USB_HYBRID] = {
 485                .name = "Pixelview PlayTV USB Hybrid",
 486                .tuner_type = TUNER_NXP_TDA18271,
 487                .tuner_addr = 0x60,
 488                .decoder = CX231XX_AVDECODER,
 489                .output_mode = OUT_MODE_VIP11,
 490                .demod_xfer_mode = 0,
 491                .ctl_pin_status_mask = 0xFFFFFFC4,
 492                .agc_analog_digital_select_gpio = 0x00, /* According with PV cxPolaris.inf file */
 493                .tuner_sif_gpio = -1,
 494                .tuner_scl_gpio = -1,
 495                .tuner_sda_gpio = -1,
 496                .gpio_pin_status_mask = 0x4001000,
 497                .tuner_i2c_master = 2,
 498                .demod_i2c_master = 1,
 499                .ir_i2c_master = 2,
 500                .rc_map_name = RC_MAP_PIXELVIEW_002T,
 501                .has_dvb = 1,
 502                .demod_addr = 0x10,
 503                .norm = V4L2_STD_PAL_M,
 504                .input = {{
 505                        .type = CX231XX_VMUX_TELEVISION,
 506                        .vmux = CX231XX_VIN_3_1,
 507                        .amux = CX231XX_AMUX_VIDEO,
 508                        .gpio = NULL,
 509                }, {
 510                        .type = CX231XX_VMUX_COMPOSITE1,
 511                        .vmux = CX231XX_VIN_2_1,
 512                        .amux = CX231XX_AMUX_LINE_IN,
 513                        .gpio = NULL,
 514                }, {
 515                        .type = CX231XX_VMUX_SVIDEO,
 516                        .vmux = CX231XX_VIN_1_1 |
 517                                (CX231XX_VIN_1_2 << 8) |
 518                                CX25840_SVIDEO_ON,
 519                        .amux = CX231XX_AMUX_LINE_IN,
 520                        .gpio = NULL,
 521                } },
 522        },
 523        [CX231XX_BOARD_PV_XCAPTURE_USB] = {
 524                .name = "Pixelview Xcapture USB",
 525                .tuner_type = TUNER_ABSENT,
 526                .decoder = CX231XX_AVDECODER,
 527                .output_mode = OUT_MODE_VIP11,
 528                .demod_xfer_mode = 0,
 529                .ctl_pin_status_mask = 0xFFFFFFC4,
 530                .agc_analog_digital_select_gpio = 0x0c,
 531                .gpio_pin_status_mask = 0x4001000,
 532                .norm = V4L2_STD_NTSC,
 533                .no_alt_vanc = 1,
 534                .external_av = 1,
 535                .dont_use_port_3 = 1,
 536
 537                .input = {{
 538                                .type = CX231XX_VMUX_COMPOSITE1,
 539                                .vmux = CX231XX_VIN_2_1,
 540                                .amux = CX231XX_AMUX_LINE_IN,
 541                                .gpio = NULL,
 542                        }, {
 543                                .type = CX231XX_VMUX_SVIDEO,
 544                                .vmux = CX231XX_VIN_1_1 |
 545                                        (CX231XX_VIN_1_2 << 8) |
 546                                        CX25840_SVIDEO_ON,
 547                                .amux = CX231XX_AMUX_LINE_IN,
 548                                .gpio = NULL,
 549                        }
 550                },
 551        },
 552
 553        [CX231XX_BOARD_ICONBIT_U100] = {
 554                .name = "Iconbit Analog Stick U100 FM",
 555                .tuner_type = TUNER_ABSENT,
 556                .decoder = CX231XX_AVDECODER,
 557                .output_mode = OUT_MODE_VIP11,
 558                .demod_xfer_mode = 0,
 559                .ctl_pin_status_mask = 0xFFFFFFC4,
 560                .agc_analog_digital_select_gpio = 0x1C,
 561                .gpio_pin_status_mask = 0x4001000,
 562
 563                .input = {{
 564                        .type = CX231XX_VMUX_COMPOSITE1,
 565                        .vmux = CX231XX_VIN_2_1,
 566                        .amux = CX231XX_AMUX_LINE_IN,
 567                        .gpio = NULL,
 568                }, {
 569                        .type = CX231XX_VMUX_SVIDEO,
 570                        .vmux = CX231XX_VIN_1_1 |
 571                                (CX231XX_VIN_1_2 << 8) |
 572                                CX25840_SVIDEO_ON,
 573                        .amux = CX231XX_AMUX_LINE_IN,
 574                        .gpio = NULL,
 575                } },
 576        },
 577        [CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL] = {
 578                .name = "Hauppauge WinTV USB2 FM (PAL)",
 579                .tuner_type = TUNER_NXP_TDA18271,
 580                .tuner_addr = 0x60,
 581                .tuner_gpio = RDE250_XCV_TUNER,
 582                .tuner_sif_gpio = 0x05,
 583                .tuner_scl_gpio = 0x1a,
 584                .tuner_sda_gpio = 0x1b,
 585                .decoder = CX231XX_AVDECODER,
 586                .output_mode = OUT_MODE_VIP11,
 587                .ctl_pin_status_mask = 0xFFFFFFC4,
 588                .agc_analog_digital_select_gpio = 0x0c,
 589                .gpio_pin_status_mask = 0x4001000,
 590                .tuner_i2c_master = 1,
 591                .norm = V4L2_STD_PAL,
 592
 593                .input = {{
 594                        .type = CX231XX_VMUX_TELEVISION,
 595                        .vmux = CX231XX_VIN_3_1,
 596                        .amux = CX231XX_AMUX_VIDEO,
 597                        .gpio = NULL,
 598                }, {
 599                        .type = CX231XX_VMUX_COMPOSITE1,
 600                        .vmux = CX231XX_VIN_2_1,
 601                        .amux = CX231XX_AMUX_LINE_IN,
 602                        .gpio = NULL,
 603                }, {
 604                        .type = CX231XX_VMUX_SVIDEO,
 605                        .vmux = CX231XX_VIN_1_1 |
 606                                (CX231XX_VIN_1_2 << 8) |
 607                                CX25840_SVIDEO_ON,
 608                        .amux = CX231XX_AMUX_LINE_IN,
 609                        .gpio = NULL,
 610                } },
 611        },
 612        [CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC] = {
 613                .name = "Hauppauge WinTV USB2 FM (NTSC)",
 614                .tuner_type = TUNER_NXP_TDA18271,
 615                .tuner_addr = 0x60,
 616                .tuner_gpio = RDE250_XCV_TUNER,
 617                .tuner_sif_gpio = 0x05,
 618                .tuner_scl_gpio = 0x1a,
 619                .tuner_sda_gpio = 0x1b,
 620                .decoder = CX231XX_AVDECODER,
 621                .output_mode = OUT_MODE_VIP11,
 622                .ctl_pin_status_mask = 0xFFFFFFC4,
 623                .agc_analog_digital_select_gpio = 0x0c,
 624                .gpio_pin_status_mask = 0x4001000,
 625                .tuner_i2c_master = 1,
 626                .norm = V4L2_STD_NTSC,
 627
 628                .input = {{
 629                        .type = CX231XX_VMUX_TELEVISION,
 630                        .vmux = CX231XX_VIN_3_1,
 631                        .amux = CX231XX_AMUX_VIDEO,
 632                        .gpio = NULL,
 633                }, {
 634                        .type = CX231XX_VMUX_COMPOSITE1,
 635                        .vmux = CX231XX_VIN_2_1,
 636                        .amux = CX231XX_AMUX_LINE_IN,
 637                        .gpio = NULL,
 638                }, {
 639                        .type = CX231XX_VMUX_SVIDEO,
 640                        .vmux = CX231XX_VIN_1_1 |
 641                                (CX231XX_VIN_1_2 << 8) |
 642                                CX25840_SVIDEO_ON,
 643                        .amux = CX231XX_AMUX_LINE_IN,
 644                        .gpio = NULL,
 645                } },
 646        },
 647        [CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2] = {
 648                .name = "Elgato Video Capture V2",
 649                .tuner_type = TUNER_ABSENT,
 650                .decoder = CX231XX_AVDECODER,
 651                .output_mode = OUT_MODE_VIP11,
 652                .demod_xfer_mode = 0,
 653                .ctl_pin_status_mask = 0xFFFFFFC4,
 654                .agc_analog_digital_select_gpio = 0x0c,
 655                .gpio_pin_status_mask = 0x4001000,
 656                .norm = V4L2_STD_NTSC,
 657                .no_alt_vanc = 1,
 658                .external_av = 1,
 659                .dont_use_port_3 = 1,
 660                .input = {{
 661                        .type = CX231XX_VMUX_COMPOSITE1,
 662                        .vmux = CX231XX_VIN_2_1,
 663                        .amux = CX231XX_AMUX_LINE_IN,
 664                        .gpio = NULL,
 665                }, {
 666                        .type = CX231XX_VMUX_SVIDEO,
 667                        .vmux = CX231XX_VIN_1_1 |
 668                                (CX231XX_VIN_1_2 << 8) |
 669                                CX25840_SVIDEO_ON,
 670                        .amux = CX231XX_AMUX_LINE_IN,
 671                        .gpio = NULL,
 672                } },
 673        },
 674        [CX231XX_BOARD_OTG102] = {
 675                .name = "Geniatech OTG102",
 676                .tuner_type = TUNER_ABSENT,
 677                .decoder = CX231XX_AVDECODER,
 678                .output_mode = OUT_MODE_VIP11,
 679                .ctl_pin_status_mask = 0xFFFFFFC4,
 680                .agc_analog_digital_select_gpio = 0x0c, 
 681                        /* According with PV CxPlrCAP.inf file */
 682                .gpio_pin_status_mask = 0x4001000,
 683                .norm = V4L2_STD_NTSC,
 684                .no_alt_vanc = 1,
 685                .external_av = 1,
 686                .dont_use_port_3 = 1,
 687                /*.has_417 = 1, */
 688                /* This board is believed to have a hardware encoding chip
 689                 * supporting mpeg1/2/4, but as the 417 is apparently not
 690                 * working for the reference board it is not here either. */
 691
 692                .input = {{
 693                                .type = CX231XX_VMUX_COMPOSITE1,
 694                                .vmux = CX231XX_VIN_2_1,
 695                                .amux = CX231XX_AMUX_LINE_IN,
 696                                .gpio = NULL,
 697                        }, {
 698                                .type = CX231XX_VMUX_SVIDEO,
 699                                .vmux = CX231XX_VIN_1_1 |
 700                                        (CX231XX_VIN_1_2 << 8) |
 701                                        CX25840_SVIDEO_ON,
 702                                .amux = CX231XX_AMUX_LINE_IN,
 703                                .gpio = NULL,
 704                        }
 705                },
 706        },
 707};
 708const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
 709
 710/* table of devices that work with this driver */
 711struct usb_device_id cx231xx_id_table[] = {
 712        {USB_DEVICE(0x0572, 0x5A3C),
 713         .driver_info = CX231XX_BOARD_UNKNOWN},
 714        {USB_DEVICE(0x0572, 0x58A2),
 715         .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
 716        {USB_DEVICE(0x0572, 0x58A1),
 717         .driver_info = CX231XX_BOARD_CNXT_SHELBY},
 718        {USB_DEVICE(0x0572, 0x58A4),
 719         .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
 720        {USB_DEVICE(0x0572, 0x58A5),
 721         .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
 722        {USB_DEVICE(0x0572, 0x58A6),
 723         .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
 724        {USB_DEVICE(0x0572, 0x589E),
 725         .driver_info = CX231XX_BOARD_CNXT_RDE_250},
 726        {USB_DEVICE(0x0572, 0x58A0),
 727         .driver_info = CX231XX_BOARD_CNXT_RDU_250},
 728        {USB_DEVICE(0x2040, 0xb110),
 729         .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},
 730        {USB_DEVICE(0x2040, 0xb111),
 731         .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
 732        {USB_DEVICE(0x2040, 0xb120),
 733         .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
 734        {USB_DEVICE(0x2040, 0xb140),
 735         .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
 736        {USB_DEVICE(0x2040, 0xc200),
 737         .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},
 738        {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),
 739         .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},
 740        {USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),
 741         .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
 742        {USB_DEVICE(0x1b80, 0xe424),
 743         .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},
 744        {USB_DEVICE(0x1b80, 0xe421),
 745         .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},
 746        {USB_DEVICE(0x1f4d, 0x0237),
 747         .driver_info = CX231XX_BOARD_ICONBIT_U100},
 748        {USB_DEVICE(0x0fd9, 0x0037),
 749         .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
 750        {USB_DEVICE(0x1f4d, 0x0102),
 751         .driver_info = CX231XX_BOARD_OTG102},
 752        {},
 753};
 754
 755MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
 756
 757/* cx231xx_tuner_callback
 758 * will be used to reset XC5000 tuner using GPIO pin
 759 */
 760
 761int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
 762{
 763        int rc = 0;
 764        struct cx231xx *dev = ptr;
 765
 766        if (dev->tuner_type == TUNER_XC5000) {
 767                if (command == XC5000_TUNER_RESET) {
 768                        cx231xx_info
 769                                ("Tuner CB: RESET: cmd %d : tuner type %d \n",
 770                                 command, dev->tuner_type);
 771                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
 772                                               1);
 773                        msleep(10);
 774                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
 775                                               0);
 776                        msleep(330);
 777                        cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
 778                                               1);
 779                        msleep(10);
 780                }
 781        } else if (dev->tuner_type == TUNER_NXP_TDA18271) {
 782                switch (command) {
 783                case TDA18271_CALLBACK_CMD_AGC_ENABLE:
 784                        if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)
 785                                rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);
 786                        break;
 787                default:
 788                        rc = -EINVAL;
 789                        break;
 790                }
 791        }
 792        return rc;
 793}
 794EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
 795
 796static void cx231xx_reset_out(struct cx231xx *dev)
 797{
 798        cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
 799        msleep(200);
 800        cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
 801        msleep(200);
 802        cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
 803}
 804
 805static void cx231xx_enable_OSC(struct cx231xx *dev)
 806{
 807        cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
 808}
 809
 810static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
 811{
 812        cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
 813}
 814
 815static inline void cx231xx_set_model(struct cx231xx *dev)
 816{
 817        dev->board = cx231xx_boards[dev->model];
 818}
 819
 820/* Since cx231xx_pre_card_setup() requires a proper dev->model,
 821 * this won't work for boards with generic PCI IDs
 822 */
 823void cx231xx_pre_card_setup(struct cx231xx *dev)
 824{
 825
 826        cx231xx_set_model(dev);
 827
 828        cx231xx_info("Identified as %s (card=%d)\n",
 829                     dev->board.name, dev->model);
 830
 831        /* set the direction for GPIO pins */
 832        if (dev->board.tuner_gpio) {
 833                cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
 834                cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
 835        }
 836        if (dev->board.tuner_sif_gpio >= 0)
 837                cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
 838
 839        /* request some modules if any required */
 840
 841        /* set the mode to Analog mode initially */
 842        cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
 843
 844        /* Unlock device */
 845        /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
 846
 847}
 848
 849static void cx231xx_config_tuner(struct cx231xx *dev)
 850{
 851        struct tuner_setup tun_setup;
 852        struct v4l2_frequency f;
 853
 854        if (dev->tuner_type == TUNER_ABSENT)
 855                return;
 856
 857        tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
 858        tun_setup.type = dev->tuner_type;
 859        tun_setup.addr = dev->tuner_addr;
 860        tun_setup.tuner_callback = cx231xx_tuner_callback;
 861
 862        tuner_call(dev, tuner, s_type_addr, &tun_setup);
 863
 864#if 0
 865        if (tun_setup.type == TUNER_XC5000) {
 866                static struct xc2028_ctrl ctrl = {
 867                        .fname = XC5000_DEFAULT_FIRMWARE,
 868                        .max_len = 64,
 869                        .demod = 0;
 870                };
 871                struct v4l2_priv_tun_config cfg = {
 872                        .tuner = dev->tuner_type,
 873                        .priv = &ctrl,
 874                };
 875                tuner_call(dev, tuner, s_config, &cfg);
 876        }
 877#endif
 878        /* configure tuner */
 879        f.tuner = 0;
 880        f.type = V4L2_TUNER_ANALOG_TV;
 881        f.frequency = 9076;     /* just a magic number */
 882        dev->ctl_freq = f.frequency;
 883        call_all(dev, tuner, s_frequency, &f);
 884
 885}
 886
 887void cx231xx_card_setup(struct cx231xx *dev)
 888{
 889
 890        cx231xx_set_model(dev);
 891
 892        dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
 893        if (cx231xx_boards[dev->model].tuner_addr)
 894                dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
 895
 896        /* request some modules */
 897        if (dev->board.decoder == CX231XX_AVDECODER) {
 898                dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
 899                                        &dev->i2c_bus[0].i2c_adap,
 900                                        "cx25840", 0x88 >> 1, NULL);
 901                if (dev->sd_cx25840 == NULL)
 902                        cx231xx_info("cx25840 subdev registration failure\n");
 903                cx25840_call(dev, core, load_fw);
 904
 905        }
 906
 907        /* Initialize the tuner */
 908        if (dev->board.tuner_type != TUNER_ABSENT) {
 909                dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
 910                                                    &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
 911                                                    "tuner",
 912                                                    dev->tuner_addr, NULL);
 913                if (dev->sd_tuner == NULL)
 914                        cx231xx_info("tuner subdev registration failure\n");
 915                else
 916                        cx231xx_config_tuner(dev);
 917        }
 918}
 919
 920/*
 921 * cx231xx_config()
 922 * inits registers with sane defaults
 923 */
 924int cx231xx_config(struct cx231xx *dev)
 925{
 926        /* TBD need to add cx231xx specific code */
 927
 928        return 0;
 929}
 930
 931/*
 932 * cx231xx_config_i2c()
 933 * configure i2c attached devices
 934 */
 935void cx231xx_config_i2c(struct cx231xx *dev)
 936{
 937        /* u32 input = INPUT(dev->video_input)->vmux; */
 938
 939        call_all(dev, video, s_stream, 1);
 940}
 941
 942/*
 943 * cx231xx_realease_resources()
 944 * unregisters the v4l2,i2c and usb devices
 945 * called when the device gets disconected or at module unload
 946*/
 947void cx231xx_release_resources(struct cx231xx *dev)
 948{
 949        cx231xx_release_analog_resources(dev);
 950
 951        cx231xx_remove_from_devlist(dev);
 952
 953        cx231xx_ir_exit(dev);
 954
 955        /* Release I2C buses */
 956        cx231xx_dev_uninit(dev);
 957
 958        /* delete v4l2 device */
 959        v4l2_device_unregister(&dev->v4l2_dev);
 960
 961        usb_put_dev(dev->udev);
 962
 963        /* Mark device as unused */
 964        clear_bit(dev->devno, &cx231xx_devused);
 965
 966        kfree(dev->video_mode.alt_max_pkt_size);
 967        kfree(dev->vbi_mode.alt_max_pkt_size);
 968        kfree(dev->sliced_cc_mode.alt_max_pkt_size);
 969        kfree(dev->ts1_mode.alt_max_pkt_size);
 970        kfree(dev);
 971}
 972
 973/*
 974 * cx231xx_init_dev()
 975 * allocates and inits the device structs, registers i2c bus and v4l device
 976 */
 977static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
 978                            int minor)
 979{
 980        int retval = -ENOMEM;
 981        unsigned int maxh, maxw;
 982
 983        dev->udev = udev;
 984        mutex_init(&dev->lock);
 985        mutex_init(&dev->ctrl_urb_lock);
 986        mutex_init(&dev->gpio_i2c_lock);
 987        mutex_init(&dev->i2c_lock);
 988
 989        spin_lock_init(&dev->video_mode.slock);
 990        spin_lock_init(&dev->vbi_mode.slock);
 991        spin_lock_init(&dev->sliced_cc_mode.slock);
 992
 993        init_waitqueue_head(&dev->open);
 994        init_waitqueue_head(&dev->wait_frame);
 995        init_waitqueue_head(&dev->wait_stream);
 996
 997        dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
 998        dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
 999        dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
1000        dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
1001        dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
1002
1003        /* Query cx231xx to find what pcb config it is related to */
1004        initialize_cx231xx(dev);
1005
1006        /*To workaround error number=-71 on EP0 for VideoGrabber,
1007                 need set alt here.*/
1008        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
1009            dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
1010                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1011                cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
1012        }
1013        /* Cx231xx pre card setup */
1014        cx231xx_pre_card_setup(dev);
1015
1016        retval = cx231xx_config(dev);
1017        if (retval) {
1018                cx231xx_errdev("error configuring device\n");
1019                return -ENOMEM;
1020        }
1021
1022        /* set default norm */
1023        dev->norm = dev->board.norm;
1024
1025        /* register i2c bus */
1026        retval = cx231xx_dev_init(dev);
1027        if (retval) {
1028                cx231xx_errdev("%s: cx231xx_i2c_register - errCode [%d]!\n",
1029                               __func__, retval);
1030                goto err_dev_init;
1031        }
1032
1033        /* Do board specific init */
1034        cx231xx_card_setup(dev);
1035
1036        /* configure the device */
1037        cx231xx_config_i2c(dev);
1038
1039        maxw = norm_maxw(dev);
1040        maxh = norm_maxh(dev);
1041
1042        /* set default image size */
1043        dev->width = maxw;
1044        dev->height = maxh;
1045        dev->interlaced = 0;
1046        dev->video_input = 0;
1047
1048        retval = cx231xx_config(dev);
1049        if (retval) {
1050                cx231xx_errdev("%s: cx231xx_config - errCode [%d]!\n",
1051                               __func__, retval);
1052                goto err_dev_init;
1053        }
1054
1055        /* init video dma queues */
1056        INIT_LIST_HEAD(&dev->video_mode.vidq.active);
1057        INIT_LIST_HEAD(&dev->video_mode.vidq.queued);
1058
1059        /* init vbi dma queues */
1060        INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
1061        INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
1062
1063        /* Reset other chips required if they are tied up with GPIO pins */
1064        cx231xx_add_into_devlist(dev);
1065
1066        if (dev->board.has_417) {
1067                printk(KERN_INFO "attach 417 %d\n", dev->model);
1068                if (cx231xx_417_register(dev) < 0) {
1069                        printk(KERN_ERR
1070                                "%s() Failed to register 417 on VID_B\n",
1071                               __func__);
1072                }
1073        }
1074
1075        retval = cx231xx_register_analog_devices(dev);
1076        if (retval) {
1077                cx231xx_release_analog_resources(dev);
1078                goto err_analog;
1079        }
1080
1081        cx231xx_ir_init(dev);
1082
1083        cx231xx_init_extension(dev);
1084
1085        return 0;
1086err_analog:
1087        cx231xx_remove_from_devlist(dev);
1088err_dev_init:
1089        cx231xx_dev_uninit(dev);
1090        return retval;
1091}
1092
1093#if defined(CONFIG_MODULES) && defined(MODULE)
1094static void request_module_async(struct work_struct *work)
1095{
1096        struct cx231xx *dev = container_of(work,
1097                                           struct cx231xx, request_module_wk);
1098
1099        if (dev->has_alsa_audio)
1100                request_module("cx231xx-alsa");
1101
1102        if (dev->board.has_dvb)
1103                request_module("cx231xx-dvb");
1104
1105}
1106
1107static void request_modules(struct cx231xx *dev)
1108{
1109        INIT_WORK(&dev->request_module_wk, request_module_async);
1110        schedule_work(&dev->request_module_wk);
1111}
1112
1113static void flush_request_modules(struct cx231xx *dev)
1114{
1115        flush_work(&dev->request_module_wk);
1116}
1117#else
1118#define request_modules(dev)
1119#define flush_request_modules(dev)
1120#endif /* CONFIG_MODULES */
1121
1122/*
1123 * cx231xx_usb_probe()
1124 * checks for supported devices
1125 */
1126static int cx231xx_usb_probe(struct usb_interface *interface,
1127                             const struct usb_device_id *id)
1128{
1129        struct usb_device *udev;
1130        struct usb_interface *uif;
1131        struct cx231xx *dev = NULL;
1132        int retval = -ENODEV;
1133        int nr = 0, ifnum;
1134        int i, isoc_pipe = 0;
1135        char *speed;
1136        struct usb_interface_assoc_descriptor *assoc_desc;
1137
1138        ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1139
1140        /*
1141         * Interface number 0 - IR interface (handled by mceusb driver)
1142         * Interface number 1 - AV interface (handled by this driver)
1143         */
1144        if (ifnum != 1)
1145                return -ENODEV;
1146
1147        /* Check to see next free device and mark as used */
1148        do {
1149                nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
1150                if (nr >= CX231XX_MAXBOARDS) {
1151                        /* No free device slots */
1152                        cx231xx_err(DRIVER_NAME ": Supports only %i devices.\n",
1153                                        CX231XX_MAXBOARDS);
1154                        return -ENOMEM;
1155                }
1156        } while (test_and_set_bit(nr, &cx231xx_devused));
1157
1158        /* allocate memory for our device state and initialize it */
1159        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1160        if (dev == NULL) {
1161                cx231xx_err(DRIVER_NAME ": out of memory!\n");
1162                clear_bit(nr, &cx231xx_devused);
1163                return -ENOMEM;
1164        }
1165
1166        udev = usb_get_dev(interface_to_usbdev(interface));
1167
1168        snprintf(dev->name, 29, "cx231xx #%d", nr);
1169        dev->devno = nr;
1170        dev->model = id->driver_info;
1171        dev->video_mode.alt = -1;
1172
1173        dev->interface_count++;
1174        /* reset gpio dir and value */
1175        dev->gpio_dir = 0;
1176        dev->gpio_val = 0;
1177        dev->xc_fw_load_done = 0;
1178        dev->has_alsa_audio = 1;
1179        dev->power_mode = -1;
1180        atomic_set(&dev->devlist_count, 0);
1181
1182        /* 0 - vbi ; 1 -sliced cc mode */
1183        dev->vbi_or_sliced_cc_mode = 0;
1184
1185        /* get maximum no.of IAD interfaces */
1186        assoc_desc = udev->actconfig->intf_assoc[0];
1187        dev->max_iad_interface_count = assoc_desc->bInterfaceCount;
1188
1189        /* init CIR module TBD */
1190
1191        /*mode_tv: digital=1 or analog=0*/
1192        dev->mode_tv = 0;
1193
1194        dev->USE_ISO = transfer_mode;
1195
1196        switch (udev->speed) {
1197        case USB_SPEED_LOW:
1198                speed = "1.5";
1199                break;
1200        case USB_SPEED_UNKNOWN:
1201        case USB_SPEED_FULL:
1202                speed = "12";
1203                break;
1204        case USB_SPEED_HIGH:
1205                speed = "480";
1206                break;
1207        default:
1208                speed = "unknown";
1209        }
1210
1211        cx231xx_info("New device %s %s @ %s Mbps "
1212             "(%04x:%04x) with %d interfaces\n",
1213             udev->manufacturer ? udev->manufacturer : "",
1214             udev->product ? udev->product : "",
1215             speed,
1216             le16_to_cpu(udev->descriptor.idVendor),
1217             le16_to_cpu(udev->descriptor.idProduct),
1218             dev->max_iad_interface_count);
1219
1220        /* increment interface count */
1221        dev->interface_count++;
1222
1223        /* get device number */
1224        nr = dev->devno;
1225
1226        assoc_desc = udev->actconfig->intf_assoc[0];
1227        if (assoc_desc->bFirstInterface != ifnum) {
1228                cx231xx_err(DRIVER_NAME ": Not found "
1229                            "matching IAD interface\n");
1230                retval = -ENODEV;
1231                goto err_if;
1232        }
1233
1234        cx231xx_info("registering interface %d\n", ifnum);
1235
1236        /* save our data pointer in this interface device */
1237        usb_set_intfdata(interface, dev);
1238
1239        /*
1240         * AV device initialization - only done at the last interface
1241         */
1242
1243        /* Create v4l2 device */
1244        retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
1245        if (retval) {
1246                cx231xx_errdev("v4l2_device_register failed\n");
1247                retval = -EIO;
1248                goto err_v4l2;
1249        }
1250        /* allocate device struct */
1251        retval = cx231xx_init_dev(dev, udev, nr);
1252        if (retval)
1253                goto err_init;
1254
1255        /* compute alternate max packet sizes for video */
1256        uif = udev->actconfig->interface[dev->current_pcb_config.
1257                       hs_config_info[0].interface_info.video_index + 1];
1258
1259        dev->video_mode.end_point_addr = uif->altsetting[0].
1260                        endpoint[isoc_pipe].desc.bEndpointAddress;
1261
1262        dev->video_mode.num_alt = uif->num_altsetting;
1263        cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1264                     dev->video_mode.end_point_addr,
1265                     dev->video_mode.num_alt);
1266        dev->video_mode.alt_max_pkt_size =
1267                kmalloc(32 * dev->video_mode.num_alt, GFP_KERNEL);
1268
1269        if (dev->video_mode.alt_max_pkt_size == NULL) {
1270                cx231xx_errdev("out of memory!\n");
1271                retval = -ENOMEM;
1272                goto err_video_alt;
1273        }
1274
1275        for (i = 0; i < dev->video_mode.num_alt; i++) {
1276                u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1277                                desc.wMaxPacketSize);
1278                dev->video_mode.alt_max_pkt_size[i] =
1279                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1280                cx231xx_info("Alternate setting %i, max size= %i\n", i,
1281                             dev->video_mode.alt_max_pkt_size[i]);
1282        }
1283
1284        /* compute alternate max packet sizes for vbi */
1285        uif = udev->actconfig->interface[dev->current_pcb_config.
1286                                       hs_config_info[0].interface_info.
1287                                       vanc_index + 1];
1288
1289        dev->vbi_mode.end_point_addr =
1290            uif->altsetting[0].endpoint[isoc_pipe].desc.
1291                        bEndpointAddress;
1292
1293        dev->vbi_mode.num_alt = uif->num_altsetting;
1294        cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1295                     dev->vbi_mode.end_point_addr,
1296                     dev->vbi_mode.num_alt);
1297        dev->vbi_mode.alt_max_pkt_size =
1298            kmalloc(32 * dev->vbi_mode.num_alt, GFP_KERNEL);
1299
1300        if (dev->vbi_mode.alt_max_pkt_size == NULL) {
1301                cx231xx_errdev("out of memory!\n");
1302                retval = -ENOMEM;
1303                goto err_vbi_alt;
1304        }
1305
1306        for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1307                u16 tmp =
1308                    le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1309                                desc.wMaxPacketSize);
1310                dev->vbi_mode.alt_max_pkt_size[i] =
1311                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1312                cx231xx_info("Alternate setting %i, max size= %i\n", i,
1313                             dev->vbi_mode.alt_max_pkt_size[i]);
1314        }
1315
1316        /* compute alternate max packet sizes for sliced CC */
1317        uif = udev->actconfig->interface[dev->current_pcb_config.
1318                                       hs_config_info[0].interface_info.
1319                                       hanc_index + 1];
1320
1321        dev->sliced_cc_mode.end_point_addr =
1322            uif->altsetting[0].endpoint[isoc_pipe].desc.
1323                        bEndpointAddress;
1324
1325        dev->sliced_cc_mode.num_alt = uif->num_altsetting;
1326        cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1327                     dev->sliced_cc_mode.end_point_addr,
1328                     dev->sliced_cc_mode.num_alt);
1329        dev->sliced_cc_mode.alt_max_pkt_size =
1330                kmalloc(32 * dev->sliced_cc_mode.num_alt, GFP_KERNEL);
1331
1332        if (dev->sliced_cc_mode.alt_max_pkt_size == NULL) {
1333                cx231xx_errdev("out of memory!\n");
1334                retval = -ENOMEM;
1335                goto err_sliced_cc_alt;
1336        }
1337
1338        for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1339                u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1340                                desc.wMaxPacketSize);
1341                dev->sliced_cc_mode.alt_max_pkt_size[i] =
1342                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1343                cx231xx_info("Alternate setting %i, max size= %i\n", i,
1344                             dev->sliced_cc_mode.alt_max_pkt_size[i]);
1345        }
1346
1347        if (dev->current_pcb_config.ts1_source != 0xff) {
1348                /* compute alternate max packet sizes for TS1 */
1349                uif = udev->actconfig->interface[dev->current_pcb_config.
1350                                               hs_config_info[0].
1351                                               interface_info.
1352                                               ts1_index + 1];
1353
1354                dev->ts1_mode.end_point_addr =
1355                    uif->altsetting[0].endpoint[isoc_pipe].
1356                                desc.bEndpointAddress;
1357
1358                dev->ts1_mode.num_alt = uif->num_altsetting;
1359                cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1360                             dev->ts1_mode.end_point_addr,
1361                             dev->ts1_mode.num_alt);
1362                dev->ts1_mode.alt_max_pkt_size =
1363                        kmalloc(32 * dev->ts1_mode.num_alt, GFP_KERNEL);
1364
1365                if (dev->ts1_mode.alt_max_pkt_size == NULL) {
1366                        cx231xx_errdev("out of memory!\n");
1367                        retval = -ENOMEM;
1368                        goto err_ts1_alt;
1369                }
1370
1371                for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1372                        u16 tmp = le16_to_cpu(uif->altsetting[i].
1373                                                endpoint[isoc_pipe].desc.
1374                                                wMaxPacketSize);
1375                        dev->ts1_mode.alt_max_pkt_size[i] =
1376                            (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1377                        cx231xx_info("Alternate setting %i, max size= %i\n", i,
1378                                     dev->ts1_mode.alt_max_pkt_size[i]);
1379                }
1380        }
1381
1382        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1383                cx231xx_enable_OSC(dev);
1384                cx231xx_reset_out(dev);
1385                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1386        }
1387
1388        if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
1389                cx231xx_sleep_s5h1432(dev);
1390
1391        /* load other modules required */
1392        request_modules(dev);
1393
1394        return 0;
1395err_ts1_alt:
1396        kfree(dev->sliced_cc_mode.alt_max_pkt_size);
1397err_sliced_cc_alt:
1398        kfree(dev->vbi_mode.alt_max_pkt_size);
1399err_vbi_alt:
1400        kfree(dev->video_mode.alt_max_pkt_size);
1401err_video_alt:
1402        /* cx231xx_uninit_dev: */
1403        cx231xx_close_extension(dev);
1404        cx231xx_ir_exit(dev);
1405        cx231xx_release_analog_resources(dev);
1406        cx231xx_417_unregister(dev);
1407        cx231xx_remove_from_devlist(dev);
1408        cx231xx_dev_uninit(dev);
1409err_init:
1410        v4l2_device_unregister(&dev->v4l2_dev);
1411err_v4l2:
1412        usb_set_intfdata(interface, NULL);
1413err_if:
1414        usb_put_dev(udev);
1415        clear_bit(dev->devno, &cx231xx_devused);
1416        kfree(dev);
1417        return retval;
1418}
1419
1420/*
1421 * cx231xx_usb_disconnect()
1422 * called when the device gets diconencted
1423 * video device will be unregistered on v4l2_close in case it is still open
1424 */
1425static void cx231xx_usb_disconnect(struct usb_interface *interface)
1426{
1427        struct cx231xx *dev;
1428
1429        dev = usb_get_intfdata(interface);
1430        usb_set_intfdata(interface, NULL);
1431
1432        if (!dev)
1433                return;
1434
1435        if (!dev->udev)
1436                return;
1437
1438        dev->state |= DEV_DISCONNECTED;
1439
1440        flush_request_modules(dev);
1441
1442        /* wait until all current v4l2 io is finished then deallocate
1443           resources */
1444        mutex_lock(&dev->lock);
1445
1446        wake_up_interruptible_all(&dev->open);
1447
1448        if (dev->users) {
1449                cx231xx_warn
1450                    ("device %s is open! Deregistration and memory "
1451                     "deallocation are deferred on close.\n",
1452                     video_device_node_name(dev->vdev));
1453
1454                /* Even having users, it is safe to remove the RC i2c driver */
1455                cx231xx_ir_exit(dev);
1456
1457                if (dev->USE_ISO)
1458                        cx231xx_uninit_isoc(dev);
1459                else
1460                        cx231xx_uninit_bulk(dev);
1461                wake_up_interruptible(&dev->wait_frame);
1462                wake_up_interruptible(&dev->wait_stream);
1463        } else {
1464        }
1465
1466        cx231xx_close_extension(dev);
1467
1468        mutex_unlock(&dev->lock);
1469
1470        if (!dev->users)
1471                cx231xx_release_resources(dev);
1472}
1473
1474static struct usb_driver cx231xx_usb_driver = {
1475        .name = "cx231xx",
1476        .probe = cx231xx_usb_probe,
1477        .disconnect = cx231xx_usb_disconnect,
1478        .id_table = cx231xx_id_table,
1479};
1480
1481module_usb_driver(cx231xx_usb_driver);
1482