| .. | .. | 
|---|
| 1958 | 1958 | } }, | 
|---|
| 1959 | 1959 | }, | 
|---|
| 1960 | 1960 | [EM2882_BOARD_TERRATEC_HYBRID_XS] = { | 
|---|
| 1961 |  | -		.name         = "Terratec Cinnergy Hybrid T USB XS (em2882)", | 
|---|
|  | 1961 | +		.name         = "Terratec Cinergy Hybrid T USB XS (em2882)", | 
|---|
| 1962 | 1962 | .tuner_type   = TUNER_XC2028, | 
|---|
| 1963 | 1963 | .tuner_gpio   = default_tuner_gpio, | 
|---|
| 1964 | 1964 | .mts_firmware = 1, | 
|---|
| .. | .. | 
|---|
| 2398 | 2398 | .ir_codes      = RC_MAP_PINNACLE_PCTV_HD, | 
|---|
| 2399 | 2399 | }, | 
|---|
| 2400 | 2400 | /* | 
|---|
|  | 2401 | +	 * 2013:0259 PCTV DVB-S2 Stick (461e_v2) | 
|---|
|  | 2402 | +	 * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A8293 | 
|---|
|  | 2403 | +	 */ | 
|---|
|  | 2404 | +	[EM28178_BOARD_PCTV_461E_V2] = { | 
|---|
|  | 2405 | +		.def_i2c_bus   = 1, | 
|---|
|  | 2406 | +		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | | 
|---|
|  | 2407 | +				 EM28XX_I2C_FREQ_400_KHZ, | 
|---|
|  | 2408 | +		.name          = "PCTV DVB-S2 Stick (461e v2)", | 
|---|
|  | 2409 | +		.tuner_type    = TUNER_ABSENT, | 
|---|
|  | 2410 | +		.tuner_gpio    = pctv_461e, | 
|---|
|  | 2411 | +		.has_dvb       = 1, | 
|---|
|  | 2412 | +		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD, | 
|---|
|  | 2413 | +	}, | 
|---|
|  | 2414 | +	/* | 
|---|
| 2401 | 2415 | * 2013:025f PCTV tripleStick (292e). | 
|---|
| 2402 | 2416 | * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157 | 
|---|
| 2403 | 2417 | */ | 
|---|
| .. | .. | 
|---|
| 2486 | 2500 | .has_dual_ts   = 1, | 
|---|
| 2487 | 2501 | .ir_codes      = RC_MAP_HAUPPAUGE, | 
|---|
| 2488 | 2502 | .leds          = hauppauge_dualhd_leds, | 
|---|
|  | 2503 | +	}, | 
|---|
|  | 2504 | +	/* | 
|---|
|  | 2505 | +	 * 1b80:e349 Magix USB Videowandler-2 | 
|---|
|  | 2506 | +	 * (same chips as Honestech VIDBOX NW03) | 
|---|
|  | 2507 | +	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner | 
|---|
|  | 2508 | +	 */ | 
|---|
|  | 2509 | +	[EM2861_BOARD_MAGIX_VIDEOWANDLER2] = { | 
|---|
|  | 2510 | +		.name                = "Magix USB Videowandler-2", | 
|---|
|  | 2511 | +		.tuner_type          = TUNER_ABSENT, | 
|---|
|  | 2512 | +		.decoder             = EM28XX_SAA711X, | 
|---|
|  | 2513 | +		.input               = { { | 
|---|
|  | 2514 | +			.type     = EM28XX_VMUX_COMPOSITE, | 
|---|
|  | 2515 | +			.vmux     = SAA7115_COMPOSITE0, | 
|---|
|  | 2516 | +			.amux     = EM28XX_AMUX_LINE_IN, | 
|---|
|  | 2517 | +		}, { | 
|---|
|  | 2518 | +			.type     = EM28XX_VMUX_SVIDEO, | 
|---|
|  | 2519 | +			.amux     = EM28XX_AMUX_LINE_IN, | 
|---|
|  | 2520 | +		} }, | 
|---|
|  | 2521 | +	}, | 
|---|
|  | 2522 | +	/* | 
|---|
|  | 2523 | +	 * 1f4d:1abe MyGica iGrabber | 
|---|
|  | 2524 | +	 * (same as several other EM2860 devices) | 
|---|
|  | 2525 | +	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner | 
|---|
|  | 2526 | +	 */ | 
|---|
|  | 2527 | +	[EM2860_BOARD_MYGICA_IGRABBER] = { | 
|---|
|  | 2528 | +		.name         = "MyGica iGrabber", | 
|---|
|  | 2529 | +		.vchannels    = 2, | 
|---|
|  | 2530 | +		.tuner_type   = TUNER_ABSENT, | 
|---|
|  | 2531 | +		.decoder      = EM28XX_SAA711X, | 
|---|
|  | 2532 | +		.input           = { { | 
|---|
|  | 2533 | +			.type     = EM28XX_VMUX_COMPOSITE, | 
|---|
|  | 2534 | +			.vmux     = SAA7115_COMPOSITE0, | 
|---|
|  | 2535 | +			.amux     = EM28XX_AMUX_LINE_IN, | 
|---|
|  | 2536 | +		}, { | 
|---|
|  | 2537 | +			.type     = EM28XX_VMUX_SVIDEO, | 
|---|
|  | 2538 | +			.vmux     = SAA7115_SVIDEO3, | 
|---|
|  | 2539 | +			.amux     = EM28XX_AMUX_LINE_IN, | 
|---|
|  | 2540 | +		} }, | 
|---|
| 2489 | 2541 | }, | 
|---|
| 2490 | 2542 | }; | 
|---|
| 2491 | 2543 | EXPORT_SYMBOL_GPL(em28xx_boards); | 
|---|
| .. | .. | 
|---|
| 2666 | 2718 | .driver_info = EM2860_BOARD_EASYCAP }, | 
|---|
| 2667 | 2719 | { USB_DEVICE(0x1b80, 0xe425), | 
|---|
| 2668 | 2720 | .driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC }, | 
|---|
|  | 2721 | +	{ USB_DEVICE(0x1f4d, 0x1abe), | 
|---|
|  | 2722 | +			.driver_info = EM2860_BOARD_MYGICA_IGRABBER }, | 
|---|
| 2669 | 2723 | { USB_DEVICE(0x2304, 0x0242), | 
|---|
| 2670 | 2724 | .driver_info = EM2884_BOARD_PCTV_510E }, | 
|---|
| 2671 | 2725 | { USB_DEVICE(0x2013, 0x0251), | 
|---|
| .. | .. | 
|---|
| 2678 | 2732 | .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE }, | 
|---|
| 2679 | 2733 | { USB_DEVICE(0x2013, 0x0258), | 
|---|
| 2680 | 2734 | .driver_info = EM28178_BOARD_PCTV_461E }, | 
|---|
|  | 2735 | +	{ USB_DEVICE(0x2013, 0x0461), | 
|---|
|  | 2736 | +			.driver_info = EM28178_BOARD_PCTV_461E_V2 }, | 
|---|
|  | 2737 | +	{ USB_DEVICE(0x2013, 0x0259), | 
|---|
|  | 2738 | +			.driver_info = EM28178_BOARD_PCTV_461E_V2 }, | 
|---|
| 2681 | 2739 | { USB_DEVICE(0x2013, 0x025f), | 
|---|
| 2682 | 2740 | .driver_info = EM28178_BOARD_PCTV_292E }, | 
|---|
| 2683 | 2741 | { USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */ | 
|---|
| .. | .. | 
|---|
| 2696 | 2754 | .driver_info = EM28178_BOARD_PLEX_PX_BCUD }, | 
|---|
| 2697 | 2755 | { USB_DEVICE(0xeb1a, 0x5051), /* Ion Video 2 PC MKII / Startech svid2usb23 / Raygo R12-41373 */ | 
|---|
| 2698 | 2756 | .driver_info = EM2860_BOARD_TVP5150_REFERENCE_DESIGN }, | 
|---|
|  | 2757 | +	{ USB_DEVICE(0x1b80, 0xe349), /* Magix USB Videowandler-2 */ | 
|---|
|  | 2758 | +		.driver_info = EM2861_BOARD_MAGIX_VIDEOWANDLER2 }, | 
|---|
| 2699 | 2759 | { }, | 
|---|
| 2700 | 2760 | }; | 
|---|
| 2701 | 2761 | MODULE_DEVICE_TABLE(usb, em28xx_id_table); | 
|---|
| .. | .. | 
|---|
| 3572 | 3632 | static int em28xx_duplicate_dev(struct em28xx *dev) | 
|---|
| 3573 | 3633 | { | 
|---|
| 3574 | 3634 | int nr; | 
|---|
| 3575 |  | -	struct em28xx *sec_dev = kzalloc(sizeof(*sec_dev), GFP_KERNEL); | 
|---|
|  | 3635 | +	struct em28xx *sec_dev = kmemdup(dev, sizeof(*sec_dev), GFP_KERNEL); | 
|---|
| 3576 | 3636 |  | 
|---|
| 3577 | 3637 | if (!sec_dev) { | 
|---|
| 3578 | 3638 | dev->dev_next = NULL; | 
|---|
| 3579 | 3639 | return -ENOMEM; | 
|---|
| 3580 | 3640 | } | 
|---|
| 3581 |  | -	memcpy(sec_dev, dev, sizeof(*sec_dev)); | 
|---|
| 3582 | 3641 | /* Check to see next free device and mark as used */ | 
|---|
| 3583 | 3642 | do { | 
|---|
| 3584 | 3643 | nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS); | 
|---|
| .. | .. | 
|---|
| 3822 | 3881 | goto err_free; | 
|---|
| 3823 | 3882 | } | 
|---|
| 3824 | 3883 |  | 
|---|
|  | 3884 | +	kref_init(&dev->ref); | 
|---|
|  | 3885 | + | 
|---|
| 3825 | 3886 | dev->devno = nr; | 
|---|
| 3826 | 3887 | dev->model = id->driver_info; | 
|---|
| 3827 | 3888 | dev->alt   = -1; | 
|---|
| .. | .. | 
|---|
| 3922 | 3983 | } | 
|---|
| 3923 | 3984 |  | 
|---|
| 3924 | 3985 | if (dev->board.has_dual_ts && em28xx_duplicate_dev(dev) == 0) { | 
|---|
|  | 3986 | +		kref_init(&dev->dev_next->ref); | 
|---|
|  | 3987 | + | 
|---|
| 3925 | 3988 | dev->dev_next->ts = SECONDARY_TS; | 
|---|
| 3926 | 3989 | dev->dev_next->alt   = -1; | 
|---|
| 3927 | 3990 | dev->dev_next->is_audio_only = has_vendor_audio && | 
|---|
| .. | .. | 
|---|
| 3976 | 4039 | em28xx_write_reg(dev, 0x0b, 0x82); | 
|---|
| 3977 | 4040 | mdelay(100); | 
|---|
| 3978 | 4041 | } | 
|---|
| 3979 |  | - | 
|---|
| 3980 |  | -		kref_init(&dev->dev_next->ref); | 
|---|
| 3981 | 4042 | } | 
|---|
| 3982 |  | - | 
|---|
| 3983 |  | -	kref_init(&dev->ref); | 
|---|
| 3984 | 4043 |  | 
|---|
| 3985 | 4044 | request_modules(dev); | 
|---|
| 3986 | 4045 |  | 
|---|
| .. | .. | 
|---|
| 4036 | 4095 |  | 
|---|
| 4037 | 4096 | em28xx_close_extension(dev); | 
|---|
| 4038 | 4097 |  | 
|---|
| 4039 |  | -	if (dev->dev_next) { | 
|---|
| 4040 |  | -		em28xx_close_extension(dev->dev_next); | 
|---|
|  | 4098 | +	if (dev->dev_next) | 
|---|
| 4041 | 4099 | em28xx_release_resources(dev->dev_next); | 
|---|
| 4042 |  | -	} | 
|---|
| 4043 |  | - | 
|---|
| 4044 | 4100 | em28xx_release_resources(dev); | 
|---|
| 4045 | 4101 |  | 
|---|
| 4046 | 4102 | if (dev->dev_next) { | 
|---|