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