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        int errCode;
 982        unsigned int maxh, maxw;
 983
 984        dev->udev = udev;
 985        mutex_init(&dev->lock);
 986        mutex_init(&dev->ctrl_urb_lock);
 987        mutex_init(&dev->gpio_i2c_lock);
 988        mutex_init(&dev->i2c_lock);
 989
 990        spin_lock_init(&dev->video_mode.slock);
 991        spin_lock_init(&dev->vbi_mode.slock);
 992        spin_lock_init(&dev->sliced_cc_mode.slock);
 993
 994        init_waitqueue_head(&dev->open);
 995        init_waitqueue_head(&dev->wait_frame);
 996        init_waitqueue_head(&dev->wait_stream);
 997
 998        dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
 999        dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
1000        dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
1001        dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
1002        dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
1003
1004        /* Query cx231xx to find what pcb config it is related to */
1005        initialize_cx231xx(dev);
1006
1007        /*To workaround error number=-71 on EP0 for VideoGrabber,
1008                 need set alt here.*/
1009        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
1010            dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
1011                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1012                cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
1013        }
1014        /* Cx231xx pre card setup */
1015        cx231xx_pre_card_setup(dev);
1016
1017        errCode = cx231xx_config(dev);
1018        if (errCode) {
1019                cx231xx_errdev("error configuring device\n");
1020                return -ENOMEM;
1021        }
1022
1023        /* set default norm */
1024        dev->norm = dev->board.norm;
1025
1026        /* register i2c bus */
1027        errCode = cx231xx_dev_init(dev);
1028        if (errCode < 0) {
1029                cx231xx_dev_uninit(dev);
1030                cx231xx_errdev("%s: cx231xx_i2c_register - errCode [%d]!\n",
1031                               __func__, errCode);
1032                return errCode;
1033        }
1034
1035        /* Do board specific init */
1036        cx231xx_card_setup(dev);
1037
1038        /* configure the device */
1039        cx231xx_config_i2c(dev);
1040
1041        maxw = norm_maxw(dev);
1042        maxh = norm_maxh(dev);
1043
1044        /* set default image size */
1045        dev->width = maxw;
1046        dev->height = maxh;
1047        dev->interlaced = 0;
1048        dev->video_input = 0;
1049
1050        errCode = cx231xx_config(dev);
1051        if (errCode < 0) {
1052                cx231xx_errdev("%s: cx231xx_config - errCode [%d]!\n",
1053                               __func__, errCode);
1054                return errCode;
1055        }
1056
1057        /* init video dma queues */
1058        INIT_LIST_HEAD(&dev->video_mode.vidq.active);
1059        INIT_LIST_HEAD(&dev->video_mode.vidq.queued);
1060
1061        /* init vbi dma queues */
1062        INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
1063        INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
1064
1065        /* Reset other chips required if they are tied up with GPIO pins */
1066        cx231xx_add_into_devlist(dev);
1067
1068        if (dev->board.has_417) {
1069                printk(KERN_INFO "attach 417 %d\n", dev->model);
1070                if (cx231xx_417_register(dev) < 0) {
1071                        printk(KERN_ERR
1072                                "%s() Failed to register 417 on VID_B\n",
1073                               __func__);
1074                }
1075        }
1076
1077        retval = cx231xx_register_analog_devices(dev);
1078        if (retval < 0) {
1079                cx231xx_release_resources(dev);
1080                return retval;
1081        }
1082
1083        cx231xx_ir_init(dev);
1084
1085        cx231xx_init_extension(dev);
1086
1087        return 0;
1088}
1089
1090#if defined(CONFIG_MODULES) && defined(MODULE)
1091static void request_module_async(struct work_struct *work)
1092{
1093        struct cx231xx *dev = container_of(work,
1094                                           struct cx231xx, request_module_wk);
1095
1096        if (dev->has_alsa_audio)
1097                request_module("cx231xx-alsa");
1098
1099        if (dev->board.has_dvb)
1100                request_module("cx231xx-dvb");
1101
1102}
1103
1104static void request_modules(struct cx231xx *dev)
1105{
1106        INIT_WORK(&dev->request_module_wk, request_module_async);
1107        schedule_work(&dev->request_module_wk);
1108}
1109
1110static void flush_request_modules(struct cx231xx *dev)
1111{
1112        flush_work(&dev->request_module_wk);
1113}
1114#else
1115#define request_modules(dev)
1116#define flush_request_modules(dev)
1117#endif /* CONFIG_MODULES */
1118
1119/*
1120 * cx231xx_usb_probe()
1121 * checks for supported devices
1122 */
1123static int cx231xx_usb_probe(struct usb_interface *interface,
1124                             const struct usb_device_id *id)
1125{
1126        struct usb_device *udev;
1127        struct usb_interface *uif;
1128        struct cx231xx *dev = NULL;
1129        int retval = -ENODEV;
1130        int nr = 0, ifnum;
1131        int i, isoc_pipe = 0;
1132        char *speed;
1133        struct usb_interface_assoc_descriptor *assoc_desc;
1134
1135        udev = usb_get_dev(interface_to_usbdev(interface));
1136        ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1137
1138        /*
1139         * Interface number 0 - IR interface (handled by mceusb driver)
1140         * Interface number 1 - AV interface (handled by this driver)
1141         */
1142        if (ifnum != 1)
1143                return -ENODEV;
1144
1145        /* Check to see next free device and mark as used */
1146        do {
1147                nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
1148                if (nr >= CX231XX_MAXBOARDS) {
1149                        /* No free device slots */
1150                        cx231xx_err(DRIVER_NAME ": Supports only %i devices.\n",
1151                                        CX231XX_MAXBOARDS);
1152                        return -ENOMEM;
1153                }
1154        } while (test_and_set_bit(nr, &cx231xx_devused));
1155
1156        /* allocate memory for our device state and initialize it */
1157        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1158        if (dev == NULL) {
1159                cx231xx_err(DRIVER_NAME ": out of memory!\n");
1160                clear_bit(nr, &cx231xx_devused);
1161                return -ENOMEM;
1162        }
1163
1164        snprintf(dev->name, 29, "cx231xx #%d", nr);
1165        dev->devno = nr;
1166        dev->model = id->driver_info;
1167        dev->video_mode.alt = -1;
1168
1169        dev->interface_count++;
1170        /* reset gpio dir and value */
1171        dev->gpio_dir = 0;
1172        dev->gpio_val = 0;
1173        dev->xc_fw_load_done = 0;
1174        dev->has_alsa_audio = 1;
1175        dev->power_mode = -1;
1176        atomic_set(&dev->devlist_count, 0);
1177
1178        /* 0 - vbi ; 1 -sliced cc mode */
1179        dev->vbi_or_sliced_cc_mode = 0;
1180
1181        /* get maximum no.of IAD interfaces */
1182        assoc_desc = udev->actconfig->intf_assoc[0];
1183        dev->max_iad_interface_count = assoc_desc->bInterfaceCount;
1184
1185        /* init CIR module TBD */
1186
1187        /*mode_tv: digital=1 or analog=0*/
1188        dev->mode_tv = 0;
1189
1190        dev->USE_ISO = transfer_mode;
1191
1192        switch (udev->speed) {
1193        case USB_SPEED_LOW:
1194                speed = "1.5";
1195                break;
1196        case USB_SPEED_UNKNOWN:
1197        case USB_SPEED_FULL:
1198                speed = "12";
1199                break;
1200        case USB_SPEED_HIGH:
1201                speed = "480";
1202                break;
1203        default:
1204                speed = "unknown";
1205        }
1206
1207        cx231xx_info("New device %s %s @ %s Mbps "
1208             "(%04x:%04x) with %d interfaces\n",
1209             udev->manufacturer ? udev->manufacturer : "",
1210             udev->product ? udev->product : "",
1211             speed,
1212             le16_to_cpu(udev->descriptor.idVendor),
1213             le16_to_cpu(udev->descriptor.idProduct),
1214             dev->max_iad_interface_count);
1215
1216        /* increment interface count */
1217        dev->interface_count++;
1218
1219        /* get device number */
1220        nr = dev->devno;
1221
1222        assoc_desc = udev->actconfig->intf_assoc[0];
1223        if (assoc_desc->bFirstInterface != ifnum) {
1224                cx231xx_err(DRIVER_NAME ": Not found "
1225                            "matching IAD interface\n");
1226                clear_bit(dev->devno, &cx231xx_devused);
1227                kfree(dev);
1228                dev = NULL;
1229                return -ENODEV;
1230        }
1231
1232        cx231xx_info("registering interface %d\n", ifnum);
1233
1234        /* save our data pointer in this interface device */
1235        usb_set_intfdata(interface, dev);
1236
1237        /*
1238         * AV device initialization - only done at the last interface
1239         */
1240
1241        /* Create v4l2 device */
1242        retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
1243        if (retval) {
1244                cx231xx_errdev("v4l2_device_register failed\n");
1245                clear_bit(dev->devno, &cx231xx_devused);
1246                kfree(dev);
1247                dev = NULL;
1248                return -EIO;
1249        }
1250        /* allocate device struct */
1251        retval = cx231xx_init_dev(dev, udev, nr);
1252        if (retval) {
1253                clear_bit(dev->devno, &cx231xx_devused);
1254                v4l2_device_unregister(&dev->v4l2_dev);
1255                kfree(dev);
1256                dev = NULL;
1257                usb_set_intfdata(interface, NULL);
1258
1259                return retval;
1260        }
1261
1262        /* compute alternate max packet sizes for video */
1263        uif = udev->actconfig->interface[dev->current_pcb_config.
1264                       hs_config_info[0].interface_info.video_index + 1];
1265
1266        dev->video_mode.end_point_addr = uif->altsetting[0].
1267                        endpoint[isoc_pipe].desc.bEndpointAddress;
1268
1269        dev->video_mode.num_alt = uif->num_altsetting;
1270        cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1271                     dev->video_mode.end_point_addr,
1272                     dev->video_mode.num_alt);
1273        dev->video_mode.alt_max_pkt_size =
1274                kmalloc(32 * dev->video_mode.num_alt, GFP_KERNEL);
1275
1276        if (dev->video_mode.alt_max_pkt_size == NULL) {
1277                cx231xx_errdev("out of memory!\n");
1278                clear_bit(dev->devno, &cx231xx_devused);
1279                v4l2_device_unregister(&dev->v4l2_dev);
1280                kfree(dev);
1281                dev = NULL;
1282                return -ENOMEM;
1283        }
1284
1285        for (i = 0; i < dev->video_mode.num_alt; i++) {
1286                u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1287                                desc.wMaxPacketSize);
1288                dev->video_mode.alt_max_pkt_size[i] =
1289                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1290                cx231xx_info("Alternate setting %i, max size= %i\n", i,
1291                             dev->video_mode.alt_max_pkt_size[i]);
1292        }
1293
1294        /* compute alternate max packet sizes for vbi */
1295        uif = udev->actconfig->interface[dev->current_pcb_config.
1296                                       hs_config_info[0].interface_info.
1297                                       vanc_index + 1];
1298
1299        dev->vbi_mode.end_point_addr =
1300            uif->altsetting[0].endpoint[isoc_pipe].desc.
1301                        bEndpointAddress;
1302
1303        dev->vbi_mode.num_alt = uif->num_altsetting;
1304        cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1305                     dev->vbi_mode.end_point_addr,
1306                     dev->vbi_mode.num_alt);
1307        dev->vbi_mode.alt_max_pkt_size =
1308            kmalloc(32 * dev->vbi_mode.num_alt, GFP_KERNEL);
1309
1310        if (dev->vbi_mode.alt_max_pkt_size == NULL) {
1311                cx231xx_errdev("out of memory!\n");
1312                clear_bit(dev->devno, &cx231xx_devused);
1313                v4l2_device_unregister(&dev->v4l2_dev);
1314                kfree(dev);
1315                dev = NULL;
1316                return -ENOMEM;
1317        }
1318
1319        for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1320                u16 tmp =
1321                    le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1322                                desc.wMaxPacketSize);
1323                dev->vbi_mode.alt_max_pkt_size[i] =
1324                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1325                cx231xx_info("Alternate setting %i, max size= %i\n", i,
1326                             dev->vbi_mode.alt_max_pkt_size[i]);
1327        }
1328
1329        /* compute alternate max packet sizes for sliced CC */
1330        uif = udev->actconfig->interface[dev->current_pcb_config.
1331                                       hs_config_info[0].interface_info.
1332                                       hanc_index + 1];
1333
1334        dev->sliced_cc_mode.end_point_addr =
1335            uif->altsetting[0].endpoint[isoc_pipe].desc.
1336                        bEndpointAddress;
1337
1338        dev->sliced_cc_mode.num_alt = uif->num_altsetting;
1339        cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1340                     dev->sliced_cc_mode.end_point_addr,
1341                     dev->sliced_cc_mode.num_alt);
1342        dev->sliced_cc_mode.alt_max_pkt_size =
1343                kmalloc(32 * dev->sliced_cc_mode.num_alt, GFP_KERNEL);
1344
1345        if (dev->sliced_cc_mode.alt_max_pkt_size == NULL) {
1346                cx231xx_errdev("out of memory!\n");
1347                clear_bit(dev->devno, &cx231xx_devused);
1348                v4l2_device_unregister(&dev->v4l2_dev);
1349                kfree(dev);
1350                dev = NULL;
1351                return -ENOMEM;
1352        }
1353
1354        for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1355                u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1356                                desc.wMaxPacketSize);
1357                dev->sliced_cc_mode.alt_max_pkt_size[i] =
1358                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1359                cx231xx_info("Alternate setting %i, max size= %i\n", i,
1360                             dev->sliced_cc_mode.alt_max_pkt_size[i]);
1361        }
1362
1363        if (dev->current_pcb_config.ts1_source != 0xff) {
1364                /* compute alternate max packet sizes for TS1 */
1365                uif = udev->actconfig->interface[dev->current_pcb_config.
1366                                               hs_config_info[0].
1367                                               interface_info.
1368                                               ts1_index + 1];
1369
1370                dev->ts1_mode.end_point_addr =
1371                    uif->altsetting[0].endpoint[isoc_pipe].
1372                                desc.bEndpointAddress;
1373
1374                dev->ts1_mode.num_alt = uif->num_altsetting;
1375                cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
1376                             dev->ts1_mode.end_point_addr,
1377                             dev->ts1_mode.num_alt);
1378                dev->ts1_mode.alt_max_pkt_size =
1379                        kmalloc(32 * dev->ts1_mode.num_alt, GFP_KERNEL);
1380
1381                if (dev->ts1_mode.alt_max_pkt_size == NULL) {
1382                        cx231xx_errdev("out of memory!\n");
1383                        clear_bit(dev->devno, &cx231xx_devused);
1384                        v4l2_device_unregister(&dev->v4l2_dev);
1385                        kfree(dev);
1386                        dev = NULL;
1387                        return -ENOMEM;
1388                }
1389
1390                for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1391                        u16 tmp = le16_to_cpu(uif->altsetting[i].
1392                                                endpoint[isoc_pipe].desc.
1393                                                wMaxPacketSize);
1394                        dev->ts1_mode.alt_max_pkt_size[i] =
1395                            (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1396                        cx231xx_info("Alternate setting %i, max size= %i\n", i,
1397                                     dev->ts1_mode.alt_max_pkt_size[i]);
1398                }
1399        }
1400
1401        if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1402                cx231xx_enable_OSC(dev);
1403                cx231xx_reset_out(dev);
1404                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
1405        }
1406
1407        if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
1408                cx231xx_sleep_s5h1432(dev);
1409
1410        /* load other modules required */
1411        request_modules(dev);
1412
1413        return 0;
1414}
1415
1416/*
1417 * cx231xx_usb_disconnect()
1418 * called when the device gets diconencted
1419 * video device will be unregistered on v4l2_close in case it is still open
1420 */
1421static void cx231xx_usb_disconnect(struct usb_interface *interface)
1422{
1423        struct cx231xx *dev;
1424
1425        dev = usb_get_intfdata(interface);
1426        usb_set_intfdata(interface, NULL);
1427
1428        if (!dev)
1429                return;
1430
1431        if (!dev->udev)
1432                return;
1433
1434        dev->state |= DEV_DISCONNECTED;
1435
1436        flush_request_modules(dev);
1437
1438        /* wait until all current v4l2 io is finished then deallocate
1439           resources */
1440        mutex_lock(&dev->lock);
1441
1442        wake_up_interruptible_all(&dev->open);
1443
1444        if (dev->users) {
1445                cx231xx_warn
1446                    ("device %s is open! Deregistration and memory "
1447                     "deallocation are deferred on close.\n",
1448                     video_device_node_name(dev->vdev));
1449
1450                /* Even having users, it is safe to remove the RC i2c driver */
1451                cx231xx_ir_exit(dev);
1452
1453                if (dev->USE_ISO)
1454                        cx231xx_uninit_isoc(dev);
1455                else
1456                        cx231xx_uninit_bulk(dev);
1457                wake_up_interruptible(&dev->wait_frame);
1458                wake_up_interruptible(&dev->wait_stream);
1459        } else {
1460        }
1461
1462        cx231xx_close_extension(dev);
1463
1464        mutex_unlock(&dev->lock);
1465
1466        if (!dev->users)
1467                cx231xx_release_resources(dev);
1468}
1469
1470static struct usb_driver cx231xx_usb_driver = {
1471        .name = "cx231xx",
1472        .probe = cx231xx_usb_probe,
1473        .disconnect = cx231xx_usb_disconnect,
1474        .id_table = cx231xx_id_table,
1475};
1476
1477module_usb_driver(cx231xx_usb_driver);
1478