1984 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 cx231xx-cards.c - driver for Conexant Cx23100/101/1024 USB video capture devices5 6 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>7 Based on em28xx driver8 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 27static int tuner = -1;28module_param(tuner, int, 0444);29MODULE_PARM_DESC(tuner, "tuner type");30 31static int transfer_mode = 1;32module_param(transfer_mode, int, 0444);33MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");34 35static unsigned int disable_ir;36module_param(disable_ir, int, 0444);37MODULE_PARM_DESC(disable_ir, "disable infrared remote support");38 39/* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */40static unsigned long cx231xx_devused;41 42/*43 * Reset sequences for analog/digital modes44 */45 46static 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 definitions55 */56struct 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 this254 * 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 chip671 * supporting mpeg1/2/4, but as the 417 is apparently not672 * 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_1_2 << 8) |683 CX25840_SVIDEO_ON,684 .amux = CX231XX_AMUX_LINE_IN,685 .gpio = NULL,686 }687 },688 },689 [CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {690 .name = "Hauppauge WinTV 930C-HD (1113xx) / HVR-900H (111xxx) / PCTV QuatroStick 521e",691 .tuner_type = TUNER_NXP_TDA18271,692 .tuner_addr = 0x60,693 .tuner_gpio = RDE250_XCV_TUNER,694 .tuner_sif_gpio = 0x05,695 .tuner_scl_gpio = 0x1a,696 .tuner_sda_gpio = 0x1b,697 .decoder = CX231XX_AVDECODER,698 .output_mode = OUT_MODE_VIP11,699 .demod_xfer_mode = 0,700 .ctl_pin_status_mask = 0xFFFFFFC4,701 .agc_analog_digital_select_gpio = 0x0c,702 .gpio_pin_status_mask = 0x4001000,703 .tuner_i2c_master = I2C_1_MUX_3,704 .demod_i2c_master = I2C_1_MUX_3,705 .has_dvb = 1,706 .demod_addr = 0x64, /* 0xc8 >> 1 */707 .norm = V4L2_STD_PAL,708 709 .input = {{710 .type = CX231XX_VMUX_TELEVISION,711 .vmux = CX231XX_VIN_3_1,712 .amux = CX231XX_AMUX_VIDEO,713 .gpio = NULL,714 }, {715 .type = CX231XX_VMUX_COMPOSITE1,716 .vmux = CX231XX_VIN_2_1,717 .amux = CX231XX_AMUX_LINE_IN,718 .gpio = NULL,719 }, {720 .type = CX231XX_VMUX_SVIDEO,721 .vmux = CX231XX_VIN_1_1 |722 (CX231XX_VIN_1_2 << 8) |723 CX25840_SVIDEO_ON,724 .amux = CX231XX_AMUX_LINE_IN,725 .gpio = NULL,726 } },727 },728 [CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx] = {729 .name = "Hauppauge WinTV 930C-HD (1114xx) / HVR-901H (1114xx) / PCTV QuatroStick 522e",730 .tuner_type = TUNER_ABSENT,731 .tuner_addr = 0x60,732 .tuner_gpio = RDE250_XCV_TUNER,733 .tuner_sif_gpio = 0x05,734 .tuner_scl_gpio = 0x1a,735 .tuner_sda_gpio = 0x1b,736 .decoder = CX231XX_AVDECODER,737 .output_mode = OUT_MODE_VIP11,738 .demod_xfer_mode = 0,739 .ctl_pin_status_mask = 0xFFFFFFC4,740 .agc_analog_digital_select_gpio = 0x0c,741 .gpio_pin_status_mask = 0x4001000,742 .tuner_i2c_master = I2C_1_MUX_3,743 .demod_i2c_master = I2C_1_MUX_3,744 .has_dvb = 1,745 .demod_addr = 0x64, /* 0xc8 >> 1 */746 .norm = V4L2_STD_PAL,747 748 .input = {{749 .type = CX231XX_VMUX_TELEVISION,750 .vmux = CX231XX_VIN_3_1,751 .amux = CX231XX_AMUX_VIDEO,752 .gpio = NULL,753 }, {754 .type = CX231XX_VMUX_COMPOSITE1,755 .vmux = CX231XX_VIN_2_1,756 .amux = CX231XX_AMUX_LINE_IN,757 .gpio = NULL,758 }, {759 .type = CX231XX_VMUX_SVIDEO,760 .vmux = CX231XX_VIN_1_1 |761 (CX231XX_VIN_1_2 << 8) |762 CX25840_SVIDEO_ON,763 .amux = CX231XX_AMUX_LINE_IN,764 .gpio = NULL,765 } },766 },767 [CX231XX_BOARD_HAUPPAUGE_955Q] = {768 .name = "Hauppauge WinTV-HVR-955Q (111401)",769 .tuner_type = TUNER_ABSENT,770 .tuner_addr = 0x60,771 .tuner_gpio = RDE250_XCV_TUNER,772 .tuner_sif_gpio = 0x05,773 .tuner_scl_gpio = 0x1a,774 .tuner_sda_gpio = 0x1b,775 .decoder = CX231XX_AVDECODER,776 .output_mode = OUT_MODE_VIP11,777 .demod_xfer_mode = 0,778 .ctl_pin_status_mask = 0xFFFFFFC4,779 .agc_analog_digital_select_gpio = 0x0c,780 .gpio_pin_status_mask = 0x4001000,781 .tuner_i2c_master = I2C_1_MUX_3,782 .demod_i2c_master = I2C_1_MUX_3,783 .has_dvb = 1,784 .demod_addr = 0x59, /* 0xb2 >> 1 */785 .norm = V4L2_STD_NTSC,786 787 .input = {{788 .type = CX231XX_VMUX_TELEVISION,789 .vmux = CX231XX_VIN_3_1,790 .amux = CX231XX_AMUX_VIDEO,791 .gpio = NULL,792 }, {793 .type = CX231XX_VMUX_COMPOSITE1,794 .vmux = CX231XX_VIN_2_1,795 .amux = CX231XX_AMUX_LINE_IN,796 .gpio = NULL,797 }, {798 .type = CX231XX_VMUX_SVIDEO,799 .vmux = CX231XX_VIN_1_1 |800 (CX231XX_VIN_1_2 << 8) |801 CX25840_SVIDEO_ON,802 .amux = CX231XX_AMUX_LINE_IN,803 .gpio = NULL,804 } },805 },806 [CX231XX_BOARD_TERRATEC_GRABBY] = {807 .name = "Terratec Grabby",808 .tuner_type = TUNER_ABSENT,809 .decoder = CX231XX_AVDECODER,810 .output_mode = OUT_MODE_VIP11,811 .demod_xfer_mode = 0,812 .ctl_pin_status_mask = 0xFFFFFFC4,813 .agc_analog_digital_select_gpio = 0x0c,814 .gpio_pin_status_mask = 0x4001000,815 .norm = V4L2_STD_PAL,816 .no_alt_vanc = 1,817 .external_av = 1,818 .input = {{819 .type = CX231XX_VMUX_COMPOSITE1,820 .vmux = CX231XX_VIN_2_1,821 .amux = CX231XX_AMUX_LINE_IN,822 .gpio = NULL,823 }, {824 .type = CX231XX_VMUX_SVIDEO,825 .vmux = CX231XX_VIN_1_1 |826 (CX231XX_VIN_1_2 << 8) |827 CX25840_SVIDEO_ON,828 .amux = CX231XX_AMUX_LINE_IN,829 .gpio = NULL,830 } },831 },832 [CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD] = {833 .name = "Evromedia USB Full Hybrid Full HD",834 .tuner_type = TUNER_ABSENT,835 .demod_addr = 0x64, /* 0xc8 >> 1 */836 .demod_i2c_master = I2C_1_MUX_3,837 .has_dvb = 1,838 .decoder = CX231XX_AVDECODER,839 .norm = V4L2_STD_PAL,840 .output_mode = OUT_MODE_VIP11,841 .tuner_addr = 0x60, /* 0xc0 >> 1 */842 .tuner_i2c_master = I2C_2,843 .input = {{844 .type = CX231XX_VMUX_TELEVISION,845 .vmux = 0,846 .amux = CX231XX_AMUX_VIDEO,847 }, {848 .type = CX231XX_VMUX_COMPOSITE1,849 .vmux = CX231XX_VIN_2_1,850 .amux = CX231XX_AMUX_LINE_IN,851 }, {852 .type = CX231XX_VMUX_SVIDEO,853 .vmux = CX231XX_VIN_1_1 |854 (CX231XX_VIN_1_2 << 8) |855 CX25840_SVIDEO_ON,856 .amux = CX231XX_AMUX_LINE_IN,857 } },858 },859 [CX231XX_BOARD_ASTROMETA_T2HYBRID] = {860 .name = "Astrometa T2hybrid",861 .tuner_type = TUNER_ABSENT,862 .has_dvb = 1,863 .decoder = CX231XX_AVDECODER,864 .output_mode = OUT_MODE_VIP11,865 .agc_analog_digital_select_gpio = 0x01,866 .ctl_pin_status_mask = 0xffffffc4,867 .demod_addr = 0x18, /* 0x30 >> 1 */868 .demod_i2c_master = I2C_1_MUX_1,869 .gpio_pin_status_mask = 0xa,870 .norm = V4L2_STD_NTSC,871 .tuner_addr = 0x3a, /* 0x74 >> 1 */872 .tuner_i2c_master = I2C_1_MUX_3,873 .tuner_scl_gpio = 0x1a,874 .tuner_sda_gpio = 0x1b,875 .tuner_sif_gpio = 0x05,876 .input = {{877 .type = CX231XX_VMUX_TELEVISION,878 .vmux = CX231XX_VIN_1_1,879 .amux = CX231XX_AMUX_VIDEO,880 }, {881 .type = CX231XX_VMUX_COMPOSITE1,882 .vmux = CX231XX_VIN_2_1,883 .amux = CX231XX_AMUX_LINE_IN,884 },885 },886 },887 [CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO] = {888 .name = "The Imaging Source DFG/USB2pro",889 .tuner_type = TUNER_ABSENT,890 .decoder = CX231XX_AVDECODER,891 .output_mode = OUT_MODE_VIP11,892 .demod_xfer_mode = 0,893 .ctl_pin_status_mask = 0xFFFFFFC4,894 .agc_analog_digital_select_gpio = 0x0c,895 .gpio_pin_status_mask = 0x4001000,896 .norm = V4L2_STD_PAL,897 .no_alt_vanc = 1,898 .external_av = 1,899 .input = {{900 .type = CX231XX_VMUX_COMPOSITE1,901 .vmux = CX231XX_VIN_1_1,902 .amux = CX231XX_AMUX_LINE_IN,903 .gpio = NULL,904 }, {905 .type = CX231XX_VMUX_SVIDEO,906 .vmux = CX231XX_VIN_2_1 |907 (CX231XX_VIN_2_2 << 8) |908 CX25840_SVIDEO_ON,909 .amux = CX231XX_AMUX_LINE_IN,910 .gpio = NULL,911 } },912 },913 [CX231XX_BOARD_HAUPPAUGE_935C] = {914 .name = "Hauppauge WinTV-HVR-935C",915 .tuner_type = TUNER_ABSENT,916 .tuner_addr = 0x60,917 .tuner_gpio = RDE250_XCV_TUNER,918 .tuner_sif_gpio = 0x05,919 .tuner_scl_gpio = 0x1a,920 .tuner_sda_gpio = 0x1b,921 .decoder = CX231XX_AVDECODER,922 .output_mode = OUT_MODE_VIP11,923 .demod_xfer_mode = 0,924 .ctl_pin_status_mask = 0xFFFFFFC4,925 .agc_analog_digital_select_gpio = 0x0c,926 .gpio_pin_status_mask = 0x4001000,927 .tuner_i2c_master = I2C_1_MUX_3,928 .demod_i2c_master = I2C_1_MUX_3,929 .has_dvb = 1,930 .demod_addr = 0x64, /* 0xc8 >> 1 */931 .norm = V4L2_STD_PAL,932 933 .input = {{934 .type = CX231XX_VMUX_TELEVISION,935 .vmux = CX231XX_VIN_3_1,936 .amux = CX231XX_AMUX_VIDEO,937 .gpio = NULL,938 }, {939 .type = CX231XX_VMUX_COMPOSITE1,940 .vmux = CX231XX_VIN_2_1,941 .amux = CX231XX_AMUX_LINE_IN,942 .gpio = NULL,943 }, {944 .type = CX231XX_VMUX_SVIDEO,945 .vmux = CX231XX_VIN_1_1 |946 (CX231XX_VIN_1_2 << 8) |947 CX25840_SVIDEO_ON,948 .amux = CX231XX_AMUX_LINE_IN,949 .gpio = NULL,950 } },951 },952 [CX231XX_BOARD_HAUPPAUGE_975] = {953 .name = "Hauppauge WinTV-HVR-975",954 .tuner_type = TUNER_ABSENT,955 .tuner_addr = 0x60,956 .tuner_gpio = RDE250_XCV_TUNER,957 .tuner_sif_gpio = 0x05,958 .tuner_scl_gpio = 0x1a,959 .tuner_sda_gpio = 0x1b,960 .decoder = CX231XX_AVDECODER,961 .output_mode = OUT_MODE_VIP11,962 .demod_xfer_mode = 0,963 .ctl_pin_status_mask = 0xFFFFFFC4,964 .agc_analog_digital_select_gpio = 0x0c,965 .gpio_pin_status_mask = 0x4001000,966 .tuner_i2c_master = I2C_1_MUX_3,967 .demod_i2c_master = I2C_1_MUX_3,968 .has_dvb = 1,969 .demod_addr = 0x59, /* 0xb2 >> 1 */970 .demod_addr2 = 0x64, /* 0xc8 >> 1 */971 .norm = V4L2_STD_ALL,972 973 .input = {{974 .type = CX231XX_VMUX_TELEVISION,975 .vmux = CX231XX_VIN_3_1,976 .amux = CX231XX_AMUX_VIDEO,977 .gpio = NULL,978 }, {979 .type = CX231XX_VMUX_COMPOSITE1,980 .vmux = CX231XX_VIN_2_1,981 .amux = CX231XX_AMUX_LINE_IN,982 .gpio = NULL,983 }, {984 .type = CX231XX_VMUX_SVIDEO,985 .vmux = CX231XX_VIN_1_1 |986 (CX231XX_VIN_1_2 << 8) |987 CX25840_SVIDEO_ON,988 .amux = CX231XX_AMUX_LINE_IN,989 .gpio = NULL,990 } },991 },992};993const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);994 995/* table of devices that work with this driver */996struct usb_device_id cx231xx_id_table[] = {997 {USB_DEVICE(0x1D19, 0x6109),998 .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},999 {USB_DEVICE(0x0572, 0x5A3C),1000 .driver_info = CX231XX_BOARD_UNKNOWN},1001 {USB_DEVICE(0x0572, 0x58A2),1002 .driver_info = CX231XX_BOARD_CNXT_CARRAERA},1003 {USB_DEVICE(0x0572, 0x58A1),1004 .driver_info = CX231XX_BOARD_CNXT_SHELBY},1005 {USB_DEVICE(0x0572, 0x58A4),1006 .driver_info = CX231XX_BOARD_CNXT_RDE_253S},1007 {USB_DEVICE(0x0572, 0x58A5),1008 .driver_info = CX231XX_BOARD_CNXT_RDU_253S},1009 {USB_DEVICE(0x0572, 0x58A6),1010 .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},1011 {USB_DEVICE(0x0572, 0x589E),1012 .driver_info = CX231XX_BOARD_CNXT_RDE_250},1013 {USB_DEVICE(0x0572, 0x58A0),1014 .driver_info = CX231XX_BOARD_CNXT_RDU_250},1015 /* AverMedia DVD EZMaker 7 */1016 {USB_DEVICE(0x07ca, 0xc039),1017 .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},1018 {USB_DEVICE(0x2040, 0xb110),1019 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},1020 {USB_DEVICE(0x2040, 0xb111),1021 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},1022 {USB_DEVICE(0x2040, 0xb120),1023 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},1024 {USB_DEVICE(0x2040, 0xb123),1025 .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},1026 {USB_DEVICE(0x2040, 0xb124),1027 .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},1028 {USB_DEVICE(0x2040, 0xb151),1029 .driver_info = CX231XX_BOARD_HAUPPAUGE_935C},1030 {USB_DEVICE(0x2040, 0xb150),1031 .driver_info = CX231XX_BOARD_HAUPPAUGE_975},1032 {USB_DEVICE(0x2040, 0xb130),1033 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},1034 {USB_DEVICE(0x2040, 0xb131),1035 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},1036 /* Hauppauge WinTV-HVR-900-H */1037 {USB_DEVICE(0x2040, 0xb138),1038 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},1039 /* Hauppauge WinTV-HVR-901-H */1040 {USB_DEVICE(0x2040, 0xb139),1041 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},1042 {USB_DEVICE(0x2040, 0xb140),1043 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},1044 {USB_DEVICE(0x2040, 0xc200),1045 .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},1046 /* PCTV QuatroStick 521e */1047 {USB_DEVICE(0x2013, 0x0259),1048 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},1049 /* PCTV QuatroStick 522e */1050 {USB_DEVICE(0x2013, 0x025e),1051 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},1052 {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),1053 .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},1054 {USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),1055 .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},1056 {USB_DEVICE(0x1b80, 0xe424),1057 .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},1058 {USB_DEVICE(0x1b80, 0xe421),1059 .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},1060 {USB_DEVICE(0x1f4d, 0x0237),1061 .driver_info = CX231XX_BOARD_ICONBIT_U100},1062 {USB_DEVICE(0x0fd9, 0x0037),1063 .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},1064 {USB_DEVICE(0x1f4d, 0x0102),1065 .driver_info = CX231XX_BOARD_OTG102},1066 {USB_DEVICE(USB_VID_TERRATEC, 0x00a6),1067 .driver_info = CX231XX_BOARD_TERRATEC_GRABBY},1068 {USB_DEVICE(0x1b80, 0xd3b2),1069 .driver_info = CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD},1070 {USB_DEVICE(0x15f4, 0x0135),1071 .driver_info = CX231XX_BOARD_ASTROMETA_T2HYBRID},1072 {USB_DEVICE(0x199e, 0x8002),1073 .driver_info = CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO},1074 {},1075};1076 1077MODULE_DEVICE_TABLE(usb, cx231xx_id_table);1078 1079/* cx231xx_tuner_callback1080 * will be used to reset XC5000 tuner using GPIO pin1081 */1082 1083int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)1084{1085 int rc = 0;1086 struct cx231xx *dev = ptr;1087 1088 if (dev->tuner_type == TUNER_XC5000) {1089 if (command == XC5000_TUNER_RESET) {1090 dev_dbg(dev->dev,1091 "Tuner CB: RESET: cmd %d : tuner type %d\n",1092 command, dev->tuner_type);1093 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,1094 1);1095 msleep(10);1096 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,1097 0);1098 msleep(330);1099 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,1100 1);1101 msleep(10);1102 }1103 } else if (dev->tuner_type == TUNER_NXP_TDA18271) {1104 switch (command) {1105 case TDA18271_CALLBACK_CMD_AGC_ENABLE:1106 if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)1107 rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);1108 break;1109 default:1110 rc = -EINVAL;1111 break;1112 }1113 }1114 return rc;1115}1116EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);1117 1118static void cx231xx_reset_out(struct cx231xx *dev)1119{1120 cx231xx_set_gpio_value(dev, CX23417_RESET, 1);1121 msleep(200);1122 cx231xx_set_gpio_value(dev, CX23417_RESET, 0);1123 msleep(200);1124 cx231xx_set_gpio_value(dev, CX23417_RESET, 1);1125}1126 1127static void cx231xx_enable_OSC(struct cx231xx *dev)1128{1129 cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);1130}1131 1132static void cx231xx_sleep_s5h1432(struct cx231xx *dev)1133{1134 cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);1135}1136 1137static inline void cx231xx_set_model(struct cx231xx *dev)1138{1139 dev->board = cx231xx_boards[dev->model];1140}1141 1142/* Since cx231xx_pre_card_setup() requires a proper dev->model,1143 * this won't work for boards with generic PCI IDs1144 */1145void cx231xx_pre_card_setup(struct cx231xx *dev)1146{1147 dev_info(dev->dev, "Identified as %s (card=%d)\n",1148 dev->board.name, dev->model);1149 1150 if (CX231XX_BOARD_ASTROMETA_T2HYBRID == dev->model) {1151 /* turn on demodulator chip */1152 cx231xx_set_gpio_value(dev, 0x03, 0x01);1153 }1154 1155 /* set the direction for GPIO pins */1156 if (dev->board.tuner_gpio) {1157 cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);1158 cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);1159 }1160 if (dev->board.tuner_sif_gpio >= 0)1161 cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);1162 1163 /* request some modules if any required */1164 1165 /* set the mode to Analog mode initially */1166 cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);1167 1168 /* Unlock device */1169 /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */1170 1171}1172 1173static void cx231xx_config_tuner(struct cx231xx *dev)1174{1175 struct tuner_setup tun_setup;1176 struct v4l2_frequency f;1177 1178 if (dev->tuner_type == TUNER_ABSENT)1179 return;1180 1181 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;1182 tun_setup.type = dev->tuner_type;1183 tun_setup.addr = dev->tuner_addr;1184 tun_setup.tuner_callback = cx231xx_tuner_callback;1185 1186 tuner_call(dev, tuner, s_type_addr, &tun_setup);1187 1188#if 01189 if (tun_setup.type == TUNER_XC5000) {1190 static struct xc2028_ctrl ctrl = {1191 .fname = XC5000_DEFAULT_FIRMWARE,1192 .max_len = 64,1193 .demod = 0;1194 };1195 struct v4l2_priv_tun_config cfg = {1196 .tuner = dev->tuner_type,1197 .priv = &ctrl,1198 };1199 tuner_call(dev, tuner, s_config, &cfg);1200 }1201#endif1202 /* configure tuner */1203 f.tuner = 0;1204 f.type = V4L2_TUNER_ANALOG_TV;1205 f.frequency = 9076; /* just a magic number */1206 dev->ctl_freq = f.frequency;1207 call_all(dev, tuner, s_frequency, &f);1208 1209}1210 1211static int read_eeprom(struct cx231xx *dev, struct i2c_client *client,1212 u8 *eedata, int len)1213{1214 int ret;1215 u8 start_offset = 0;1216 int len_todo = len;1217 u8 *eedata_cur = eedata;1218 int i;1219 struct i2c_msg msg_write = { .addr = client->addr, .flags = 0,1220 .buf = &start_offset, .len = 1 };1221 struct i2c_msg msg_read = { .addr = client->addr, .flags = I2C_M_RD };1222 1223 /* start reading at offset 0 */1224 ret = i2c_transfer(client->adapter, &msg_write, 1);1225 if (ret < 0) {1226 dev_err(dev->dev, "Can't read eeprom\n");1227 return ret;1228 }1229 1230 while (len_todo > 0) {1231 msg_read.len = (len_todo > 64) ? 64 : len_todo;1232 msg_read.buf = eedata_cur;1233 1234 ret = i2c_transfer(client->adapter, &msg_read, 1);1235 if (ret < 0) {1236 dev_err(dev->dev, "Can't read eeprom\n");1237 return ret;1238 }1239 eedata_cur += msg_read.len;1240 len_todo -= msg_read.len;1241 }1242 1243 for (i = 0; i + 15 < len; i += 16)1244 dev_dbg(dev->dev, "i2c eeprom %02x: %*ph\n",1245 i, 16, &eedata[i]);1246 1247 return 0;1248}1249 1250void cx231xx_card_setup(struct cx231xx *dev)1251{1252 1253 cx231xx_set_model(dev);1254 1255 dev->tuner_type = cx231xx_boards[dev->model].tuner_type;1256 if (cx231xx_boards[dev->model].tuner_addr)1257 dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;1258 1259 /* request some modules */1260 if (dev->board.decoder == CX231XX_AVDECODER) {1261 dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,1262 cx231xx_get_i2c_adap(dev, I2C_0),1263 "cx25840", 0x88 >> 1, NULL);1264 if (dev->sd_cx25840 == NULL)1265 dev_err(dev->dev,1266 "cx25840 subdev registration failure\n");1267 cx25840_call(dev, core, load_fw);1268 1269 }1270 1271 /* Initialize the tuner */1272 if (dev->board.tuner_type != TUNER_ABSENT) {1273 struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,1274 dev->board.tuner_i2c_master);1275 dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,1276 tuner_i2c,1277 "tuner",1278 dev->tuner_addr, NULL);1279 if (dev->sd_tuner == NULL)1280 dev_err(dev->dev,1281 "tuner subdev registration failure\n");1282 else1283 cx231xx_config_tuner(dev);1284 }1285 1286 switch (dev->model) {1287 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:1288 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:1289 case CX231XX_BOARD_HAUPPAUGE_955Q:1290 case CX231XX_BOARD_HAUPPAUGE_935C:1291 case CX231XX_BOARD_HAUPPAUGE_975:1292 {1293 struct eeprom {1294 struct tveeprom tvee;1295 u8 eeprom[256];1296 struct i2c_client client;1297 };1298 struct eeprom *e = kzalloc(sizeof(*e), GFP_KERNEL);1299 1300 if (e == NULL) {1301 dev_err(dev->dev,1302 "failed to allocate memory to read eeprom\n");1303 break;1304 }1305 e->client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);1306 e->client.addr = 0xa0 >> 1;1307 1308 read_eeprom(dev, &e->client, e->eeprom, sizeof(e->eeprom));1309 tveeprom_hauppauge_analog(&e->tvee, e->eeprom + 0xc0);1310 kfree(e);1311 break;1312 }1313 }1314 1315}1316 1317/*1318 * cx231xx_config()1319 * inits registers with sane defaults1320 */1321int cx231xx_config(struct cx231xx *dev)1322{1323 /* TBD need to add cx231xx specific code */1324 1325 return 0;1326}1327 1328/*1329 * cx231xx_config_i2c()1330 * configure i2c attached devices1331 */1332void cx231xx_config_i2c(struct cx231xx *dev)1333{1334 /* u32 input = INPUT(dev->video_input)->vmux; */1335 1336 call_all(dev, video, s_stream, 1);1337}1338 1339static void cx231xx_unregister_media_device(struct cx231xx *dev)1340{1341#ifdef CONFIG_MEDIA_CONTROLLER1342 if (dev->media_dev) {1343 media_device_unregister(dev->media_dev);1344 media_device_cleanup(dev->media_dev);1345 kfree(dev->media_dev);1346 dev->media_dev = NULL;1347 }1348#endif1349}1350 1351/*1352 * cx231xx_realease_resources()1353 * unregisters the v4l2,i2c and usb devices1354 * called when the device gets disconnected or at module unload1355*/1356void cx231xx_release_resources(struct cx231xx *dev)1357{1358 cx231xx_ir_exit(dev);1359 1360 cx231xx_release_analog_resources(dev);1361 1362 cx231xx_remove_from_devlist(dev);1363 1364 /* Release I2C buses */1365 cx231xx_dev_uninit(dev);1366 1367 /* delete v4l2 device */1368 v4l2_device_unregister(&dev->v4l2_dev);1369 1370 cx231xx_unregister_media_device(dev);1371 1372 usb_put_dev(dev->udev);1373 1374 /* Mark device as unused */1375 clear_bit(dev->devno, &cx231xx_devused);1376}1377 1378static int cx231xx_media_device_init(struct cx231xx *dev,1379 struct usb_device *udev)1380{1381#ifdef CONFIG_MEDIA_CONTROLLER1382 struct media_device *mdev;1383 1384 mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);1385 if (!mdev)1386 return -ENOMEM;1387 1388 media_device_usb_init(mdev, udev, dev->board.name);1389 1390 dev->media_dev = mdev;1391#endif1392 return 0;1393}1394 1395/*1396 * cx231xx_init_dev()1397 * allocates and inits the device structs, registers i2c bus and v4l device1398 */1399static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,1400 int minor)1401{1402 int retval = -ENOMEM;1403 unsigned int maxh, maxw;1404 1405 dev->udev = udev;1406 mutex_init(&dev->lock);1407 mutex_init(&dev->ctrl_urb_lock);1408 mutex_init(&dev->gpio_i2c_lock);1409 mutex_init(&dev->i2c_lock);1410 1411 spin_lock_init(&dev->video_mode.slock);1412 spin_lock_init(&dev->vbi_mode.slock);1413 spin_lock_init(&dev->sliced_cc_mode.slock);1414 1415 init_waitqueue_head(&dev->open);1416 init_waitqueue_head(&dev->wait_frame);1417 init_waitqueue_head(&dev->wait_stream);1418 1419 dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;1420 dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;1421 dev->cx231xx_send_usb_command = cx231xx_send_usb_command;1422 dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;1423 dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;1424 1425 /* Query cx231xx to find what pcb config it is related to */1426 retval = initialize_cx231xx(dev);1427 if (retval < 0) {1428 dev_err(dev->dev, "Failed to read PCB config\n");1429 return retval;1430 }1431 1432 /*To workaround error number=-71 on EP0 for VideoGrabber,1433 need set alt here.*/1434 if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||1435 dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {1436 cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);1437 cx231xx_set_alt_setting(dev, INDEX_VANC, 1);1438 }1439 /* Cx231xx pre card setup */1440 cx231xx_pre_card_setup(dev);1441 1442 retval = cx231xx_config(dev);1443 if (retval) {1444 dev_err(dev->dev, "error configuring device\n");1445 return -ENOMEM;1446 }1447 1448 /* set default norm */1449 dev->norm = dev->board.norm;1450 1451 /* register i2c bus */1452 retval = cx231xx_dev_init(dev);1453 if (retval) {1454 dev_err(dev->dev,1455 "%s: cx231xx_i2c_register - errCode [%d]!\n",1456 __func__, retval);1457 goto err_dev_init;1458 }1459 1460 /* Do board specific init */1461 cx231xx_card_setup(dev);1462 1463 /* configure the device */1464 cx231xx_config_i2c(dev);1465 1466 maxw = norm_maxw(dev);1467 maxh = norm_maxh(dev);1468 1469 /* set default image size */1470 dev->width = maxw;1471 dev->height = maxh;1472 dev->interlaced = 0;1473 dev->video_input = 0;1474 1475 retval = cx231xx_config(dev);1476 if (retval) {1477 dev_err(dev->dev, "%s: cx231xx_config - errCode [%d]!\n",1478 __func__, retval);1479 goto err_dev_init;1480 }1481 1482 /* init video dma queue */1483 INIT_LIST_HEAD(&dev->video_mode.vidq.active);1484 1485 /* init vbi dma queue */1486 INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);1487 1488 /* Reset other chips required if they are tied up with GPIO pins */1489 cx231xx_add_into_devlist(dev);1490 1491 if (dev->board.has_417) {1492 dev_info(dev->dev, "attach 417 %d\n", dev->model);1493 if (cx231xx_417_register(dev) < 0) {1494 dev_err(dev->dev,1495 "%s() Failed to register 417 on VID_B\n",1496 __func__);1497 }1498 }1499 1500 retval = cx231xx_register_analog_devices(dev);1501 if (retval)1502 goto err_analog;1503 1504 cx231xx_ir_init(dev);1505 1506 cx231xx_init_extension(dev);1507 1508 return 0;1509err_analog:1510 cx231xx_unregister_media_device(dev);1511 cx231xx_release_analog_resources(dev);1512 cx231xx_remove_from_devlist(dev);1513err_dev_init:1514 cx231xx_dev_uninit(dev);1515 return retval;1516}1517 1518#if defined(CONFIG_MODULES) && defined(MODULE)1519static void request_module_async(struct work_struct *work)1520{1521 struct cx231xx *dev = container_of(work,1522 struct cx231xx, request_module_wk);1523 1524 if (dev->has_alsa_audio)1525 request_module("cx231xx-alsa");1526 1527 if (dev->board.has_dvb)1528 request_module("cx231xx-dvb");1529 1530}1531 1532static void request_modules(struct cx231xx *dev)1533{1534 INIT_WORK(&dev->request_module_wk, request_module_async);1535 schedule_work(&dev->request_module_wk);1536}1537 1538static void flush_request_modules(struct cx231xx *dev)1539{1540 flush_work(&dev->request_module_wk);1541}1542#else1543#define request_modules(dev)1544#define flush_request_modules(dev)1545#endif /* CONFIG_MODULES */1546 1547static int cx231xx_init_v4l2(struct cx231xx *dev,1548 struct usb_device *udev,1549 struct usb_interface *interface,1550 int isoc_pipe)1551{1552 struct usb_interface *uif;1553 int i, idx;1554 1555 /* Video Init */1556 1557 /* compute alternate max packet sizes for video */1558 idx = dev->current_pcb_config.hs_config_info[0].interface_info.video_index + 1;1559 if (idx >= dev->max_iad_interface_count) {1560 dev_err(dev->dev,1561 "Video PCB interface #%d doesn't exist\n", idx);1562 return -ENODEV;1563 }1564 1565 uif = udev->actconfig->interface[idx];1566 1567 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)1568 return -ENODEV;1569 1570 dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;1571 dev->video_mode.num_alt = uif->num_altsetting;1572 1573 dev_info(dev->dev,1574 "video EndPoint Addr 0x%x, Alternate settings: %i\n",1575 dev->video_mode.end_point_addr,1576 dev->video_mode.num_alt);1577 1578 dev->video_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->video_mode.num_alt, GFP_KERNEL);1579 if (dev->video_mode.alt_max_pkt_size == NULL)1580 return -ENOMEM;1581 1582 for (i = 0; i < dev->video_mode.num_alt; i++) {1583 u16 tmp;1584 1585 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)1586 return -ENODEV;1587 1588 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);1589 dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);1590 dev_dbg(dev->dev,1591 "Alternate setting %i, max size= %i\n", i,1592 dev->video_mode.alt_max_pkt_size[i]);1593 }1594 1595 /* VBI Init */1596 1597 idx = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index + 1;1598 if (idx >= dev->max_iad_interface_count) {1599 dev_err(dev->dev,1600 "VBI PCB interface #%d doesn't exist\n", idx);1601 return -ENODEV;1602 }1603 uif = udev->actconfig->interface[idx];1604 1605 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)1606 return -ENODEV;1607 1608 dev->vbi_mode.end_point_addr =1609 uif->altsetting[0].endpoint[isoc_pipe].desc.1610 bEndpointAddress;1611 1612 dev->vbi_mode.num_alt = uif->num_altsetting;1613 dev_info(dev->dev,1614 "VBI EndPoint Addr 0x%x, Alternate settings: %i\n",1615 dev->vbi_mode.end_point_addr,1616 dev->vbi_mode.num_alt);1617 1618 /* compute alternate max packet sizes for vbi */1619 dev->vbi_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->vbi_mode.num_alt, GFP_KERNEL);1620 if (dev->vbi_mode.alt_max_pkt_size == NULL)1621 return -ENOMEM;1622 1623 for (i = 0; i < dev->vbi_mode.num_alt; i++) {1624 u16 tmp;1625 1626 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)1627 return -ENODEV;1628 1629 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].1630 desc.wMaxPacketSize);1631 dev->vbi_mode.alt_max_pkt_size[i] =1632 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);1633 dev_dbg(dev->dev,1634 "Alternate setting %i, max size= %i\n", i,1635 dev->vbi_mode.alt_max_pkt_size[i]);1636 }1637 1638 /* Sliced CC VBI init */1639 1640 /* compute alternate max packet sizes for sliced CC */1641 idx = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index + 1;1642 if (idx >= dev->max_iad_interface_count) {1643 dev_err(dev->dev,1644 "Sliced CC PCB interface #%d doesn't exist\n", idx);1645 return -ENODEV;1646 }1647 uif = udev->actconfig->interface[idx];1648 1649 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)1650 return -ENODEV;1651 1652 dev->sliced_cc_mode.end_point_addr =1653 uif->altsetting[0].endpoint[isoc_pipe].desc.1654 bEndpointAddress;1655 1656 dev->sliced_cc_mode.num_alt = uif->num_altsetting;1657 dev_info(dev->dev,1658 "sliced CC EndPoint Addr 0x%x, Alternate settings: %i\n",1659 dev->sliced_cc_mode.end_point_addr,1660 dev->sliced_cc_mode.num_alt);1661 dev->sliced_cc_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->sliced_cc_mode.num_alt, GFP_KERNEL);1662 if (dev->sliced_cc_mode.alt_max_pkt_size == NULL)1663 return -ENOMEM;1664 1665 for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {1666 u16 tmp;1667 1668 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)1669 return -ENODEV;1670 1671 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].1672 desc.wMaxPacketSize);1673 dev->sliced_cc_mode.alt_max_pkt_size[i] =1674 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);1675 dev_dbg(dev->dev,1676 "Alternate setting %i, max size= %i\n", i,1677 dev->sliced_cc_mode.alt_max_pkt_size[i]);1678 }1679 1680 return 0;1681}1682 1683/*1684 * cx231xx_usb_probe()1685 * checks for supported devices1686 */1687static int cx231xx_usb_probe(struct usb_interface *interface,1688 const struct usb_device_id *id)1689{1690 struct usb_device *udev;1691 struct device *d = &interface->dev;1692 struct usb_interface *uif;1693 struct cx231xx *dev = NULL;1694 int retval = -ENODEV;1695 int nr = 0, ifnum;1696 int i, isoc_pipe = 0;1697 char *speed;1698 u8 idx;1699 struct usb_interface_assoc_descriptor *assoc_desc;1700 1701 ifnum = interface->altsetting[0].desc.bInterfaceNumber;1702 1703 /*1704 * Interface number 0 - IR interface (handled by mceusb driver)1705 * Interface number 1 - AV interface (handled by this driver)1706 */1707 if (ifnum != 1)1708 return -ENODEV;1709 1710 /* Check to see next free device and mark as used */1711 do {1712 nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);1713 if (nr >= CX231XX_MAXBOARDS) {1714 /* No free device slots */1715 dev_err(d,1716 "Supports only %i devices.\n",1717 CX231XX_MAXBOARDS);1718 return -ENOMEM;1719 }1720 } while (test_and_set_bit(nr, &cx231xx_devused));1721 1722 udev = usb_get_dev(interface_to_usbdev(interface));1723 1724 /* allocate memory for our device state and initialize it */1725 dev = devm_kzalloc(&udev->dev, sizeof(*dev), GFP_KERNEL);1726 if (dev == NULL) {1727 retval = -ENOMEM;1728 goto err_if;1729 }1730 1731 snprintf(dev->name, 29, "cx231xx #%d", nr);1732 dev->devno = nr;1733 dev->model = id->driver_info;1734 dev->video_mode.alt = -1;1735 dev->dev = d;1736 1737 cx231xx_set_model(dev);1738 1739 dev->interface_count++;1740 /* reset gpio dir and value */1741 dev->gpio_dir = 0;1742 dev->gpio_val = 0;1743 dev->xc_fw_load_done = 0;1744 dev->has_alsa_audio = 1;1745 dev->power_mode = -1;1746 atomic_set(&dev->devlist_count, 0);1747 1748 /* 0 - vbi ; 1 -sliced cc mode */1749 dev->vbi_or_sliced_cc_mode = 0;1750 1751 /* get maximum no.of IAD interfaces */1752 dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;1753 1754 /* init CIR module TBD */1755 1756 /*mode_tv: digital=1 or analog=0*/1757 dev->mode_tv = 0;1758 1759 dev->USE_ISO = transfer_mode;1760 1761 switch (udev->speed) {1762 case USB_SPEED_LOW:1763 speed = "1.5";1764 break;1765 case USB_SPEED_UNKNOWN:1766 case USB_SPEED_FULL:1767 speed = "12";1768 break;1769 case USB_SPEED_HIGH:1770 speed = "480";1771 break;1772 default:1773 speed = "unknown";1774 }1775 1776 dev_info(d,1777 "New device %s %s @ %s Mbps (%04x:%04x) with %d interfaces\n",1778 udev->manufacturer ? udev->manufacturer : "",1779 udev->product ? udev->product : "",1780 speed,1781 le16_to_cpu(udev->descriptor.idVendor),1782 le16_to_cpu(udev->descriptor.idProduct),1783 dev->max_iad_interface_count);1784 1785 /* increment interface count */1786 dev->interface_count++;1787 1788 /* get device number */1789 nr = dev->devno;1790 1791 assoc_desc = udev->actconfig->intf_assoc[0];1792 if (!assoc_desc || assoc_desc->bFirstInterface != ifnum) {1793 dev_err(d, "Not found matching IAD interface\n");1794 retval = -ENODEV;1795 goto err_if;1796 }1797 1798 dev_dbg(d, "registering interface %d\n", ifnum);1799 1800 /* save our data pointer in this interface device */1801 usb_set_intfdata(interface, dev);1802 1803 /* Initialize the media controller */1804 retval = cx231xx_media_device_init(dev, udev);1805 if (retval) {1806 dev_err(d, "cx231xx_media_device_init failed\n");1807 goto err_media_init;1808 }1809 1810 /* Create v4l2 device */1811#ifdef CONFIG_MEDIA_CONTROLLER1812 dev->v4l2_dev.mdev = dev->media_dev;1813#endif1814 retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);1815 if (retval) {1816 dev_err(d, "v4l2_device_register failed\n");1817 goto err_v4l2;1818 }1819 1820 /* allocate device struct */1821 retval = cx231xx_init_dev(dev, udev, nr);1822 if (retval)1823 goto err_init;1824 1825 retval = cx231xx_init_v4l2(dev, udev, interface, isoc_pipe);1826 if (retval)1827 goto err_init;1828 1829 if (dev->current_pcb_config.ts1_source != 0xff) {1830 /* compute alternate max packet sizes for TS1 */1831 idx = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index + 1;1832 if (idx >= dev->max_iad_interface_count) {1833 dev_err(d, "TS1 PCB interface #%d doesn't exist\n",1834 idx);1835 retval = -ENODEV;1836 goto err_video_alt;1837 }1838 uif = udev->actconfig->interface[idx];1839 1840 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1) {1841 retval = -ENODEV;1842 goto err_video_alt;1843 }1844 1845 dev->ts1_mode.end_point_addr =1846 uif->altsetting[0].endpoint[isoc_pipe].1847 desc.bEndpointAddress;1848 1849 dev->ts1_mode.num_alt = uif->num_altsetting;1850 dev_info(d,1851 "TS EndPoint Addr 0x%x, Alternate settings: %i\n",1852 dev->ts1_mode.end_point_addr,1853 dev->ts1_mode.num_alt);1854 1855 dev->ts1_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->ts1_mode.num_alt, GFP_KERNEL);1856 if (dev->ts1_mode.alt_max_pkt_size == NULL) {1857 retval = -ENOMEM;1858 goto err_video_alt;1859 }1860 1861 for (i = 0; i < dev->ts1_mode.num_alt; i++) {1862 u16 tmp;1863 1864 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1) {1865 retval = -ENODEV;1866 goto err_video_alt;1867 }1868 1869 tmp = le16_to_cpu(uif->altsetting[i].1870 endpoint[isoc_pipe].desc.1871 wMaxPacketSize);1872 dev->ts1_mode.alt_max_pkt_size[i] =1873 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);1874 dev_dbg(d, "Alternate setting %i, max size= %i\n",1875 i, dev->ts1_mode.alt_max_pkt_size[i]);1876 }1877 }1878 1879 if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {1880 cx231xx_enable_OSC(dev);1881 cx231xx_reset_out(dev);1882 cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);1883 }1884 1885 if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)1886 cx231xx_sleep_s5h1432(dev);1887 1888 /* load other modules required */1889 request_modules(dev);1890 1891#ifdef CONFIG_MEDIA_CONTROLLER1892 /* Init entities at the Media Controller */1893 cx231xx_v4l2_create_entities(dev);1894 1895 retval = v4l2_mc_create_media_graph(dev->media_dev);1896 if (!retval)1897 retval = media_device_register(dev->media_dev);1898#endif1899 if (retval < 0)1900 cx231xx_release_resources(dev);1901 return retval;1902 1903err_video_alt:1904 /* cx231xx_uninit_dev: */1905 cx231xx_close_extension(dev);1906 cx231xx_ir_exit(dev);1907 cx231xx_release_analog_resources(dev);1908 cx231xx_417_unregister(dev);1909 cx231xx_remove_from_devlist(dev);1910 cx231xx_dev_uninit(dev);1911err_init:1912 v4l2_device_unregister(&dev->v4l2_dev);1913err_v4l2:1914 cx231xx_unregister_media_device(dev);1915err_media_init:1916 usb_set_intfdata(interface, NULL);1917err_if:1918 usb_put_dev(udev);1919 clear_bit(nr, &cx231xx_devused);1920 return retval;1921}1922 1923/*1924 * cx231xx_usb_disconnect()1925 * called when the device gets disconnected1926 * video device will be unregistered on v4l2_close in case it is still open1927 */1928static void cx231xx_usb_disconnect(struct usb_interface *interface)1929{1930 struct cx231xx *dev;1931 1932 dev = usb_get_intfdata(interface);1933 usb_set_intfdata(interface, NULL);1934 1935 if (!dev)1936 return;1937 1938 if (!dev->udev)1939 return;1940 1941 dev->state |= DEV_DISCONNECTED;1942 1943 flush_request_modules(dev);1944 1945 /* wait until all current v4l2 io is finished then deallocate1946 resources */1947 mutex_lock(&dev->lock);1948 1949 wake_up_interruptible_all(&dev->open);1950 1951 if (dev->users) {1952 dev_warn(dev->dev,1953 "device %s is open! Deregistration and memory deallocation are deferred on close.\n",1954 video_device_node_name(&dev->vdev));1955 1956 /* Even having users, it is safe to remove the RC i2c driver */1957 cx231xx_ir_exit(dev);1958 1959 if (dev->USE_ISO)1960 cx231xx_uninit_isoc(dev);1961 else1962 cx231xx_uninit_bulk(dev);1963 wake_up_interruptible(&dev->wait_frame);1964 wake_up_interruptible(&dev->wait_stream);1965 } else {1966 }1967 1968 cx231xx_close_extension(dev);1969 1970 mutex_unlock(&dev->lock);1971 1972 if (!dev->users)1973 cx231xx_release_resources(dev);1974}1975 1976static struct usb_driver cx231xx_usb_driver = {1977 .name = "cx231xx",1978 .probe = cx231xx_usb_probe,1979 .disconnect = cx231xx_usb_disconnect,1980 .id_table = cx231xx_id_table,1981};1982 1983module_usb_driver(cx231xx_usb_driver);1984