| .. | .. |
|---|
| 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) { |
|---|