File Index
Files and directories
Sign in
FILE

cx231xx-cards.c

File preview with syntax highlighting.

linux-6.19.14/drivers/media/usb/cx231xx/cx231xx-cards.c C
   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
  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 modes
  44 */
  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 definitions
  55 */
  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 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
 993/* table of devices that work with this driver */
 994struct usb_device_id cx231xx_id_table[] = {
 995	{USB_DEVICE(0x1D19, 0x6108),
 996	.driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
 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_callback
1080 * will be used to reset XC5000 tuner using GPIO pin
1081 */
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 IDs
1144 */
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 0
1189	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#endif
1202	/* 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		else
1283			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 defaults
1320 */
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 devices
1331 */
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_CONTROLLER
1342	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#endif
1349}
1350
1351/*
1352 * cx231xx_realease_resources()
1353 * unregisters the v4l2,i2c and usb devices
1354 * called when the device gets disconnected or at module unload
1355*/
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_CONTROLLER
1382	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#endif
1392	return 0;
1393}
1394
1395/*
1396 * cx231xx_init_dev()
1397 * allocates and inits the device structs, registers i2c bus and v4l device
1398 */
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#else
1543#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 devices
1686 */
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_CONTROLLER
1812	dev->v4l2_dev.mdev = dev->media_dev;
1813#endif
1814	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_CONTROLLER
1892	/* 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#endif
1899	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 disconnected
1926 * video device will be unregistered on v4l2_close in case it is still open
1927 */
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 deallocate
1946	   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		else
1962			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);
~/ Read-only file preview.