^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) // em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) // video capture devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) // Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) // Markus Rechberger <mrechberger@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) // Mauro Carvalho Chehab <mchehab@kernel.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) // Sascha Sommer <saschasommer@freenet.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) // Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) // This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) // it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) // the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) // (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) // This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) // but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) // GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include "em28xx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <media/tuner.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <media/drv-intf/msp3400.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <media/i2c/saa7115.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <dt-bindings/media/tvp5150.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <media/i2c/tvaudio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <media/tveeprom.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <media/v4l2-common.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <sound/ac97_codec.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DRIVER_NAME "em28xx"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) static int tuner = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) module_param(tuner, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) MODULE_PARM_DESC(tuner, "tuner type");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static unsigned int disable_ir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) module_param(disable_ir, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static unsigned int disable_usb_speed_check;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) module_param(disable_usb_speed_check, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) MODULE_PARM_DESC(disable_usb_speed_check,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) "override min bandwidth requirement of 480M bps");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) module_param_array(card, int, NULL, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) MODULE_PARM_DESC(card, "card type");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) static int usb_xfer_mode = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) module_param(usb_xfer_mode, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) MODULE_PARM_DESC(usb_xfer_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct em28xx_hash_table {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) unsigned long hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) unsigned int model;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) unsigned int tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) static void em28xx_pre_card_setup(struct em28xx *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * Reset sequences for analog/digital modes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* Reset for the most [analog] boards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) static const struct em28xx_reg_seq default_analog[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /* Reset for the most [digital] boards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static const struct em28xx_reg_seq default_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* Board :Zolid Hybrid Tv Stick */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static struct em28xx_reg_seq zolid_tuner[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) {EM2820_R08_GPIO_CTRL, 0xfd, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static struct em28xx_reg_seq zolid_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) {EM2820_R08_GPIO_CTRL, 0x6a, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {EM2820_R08_GPIO_CTRL, 0x7a, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {EM2880_R04_GPO, 0x04, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {EM2880_R04_GPO, 0x0c, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* Board Hauppauge WinTV HVR 900 analog */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {EM2820_R08_GPIO_CTRL, 0x2d, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) { 0x05, 0xff, 0x10, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /* Board Hauppauge WinTV HVR 900 digital */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {EM2880_R04_GPO, 0x04, 0x0f, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {EM2880_R04_GPO, 0x0c, 0x0f, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* Board Hauppauge WinTV HVR 900 (R2) digital */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) static const struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {EM2880_R04_GPO, 0x0c, 0x0f, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) static const struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {EM2820_R08_GPIO_CTRL, 0x69, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* Board - EM2882 Kworld 315U digital */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static const struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {EM2880_R04_GPO, 0x04, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {EM2880_R04_GPO, 0x0c, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {EM2820_R08_GPIO_CTRL, 0x7e, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static const struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {EM2880_R04_GPO, 0x08, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {EM2880_R04_GPO, 0x0c, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) {EM2880_R04_GPO, 0x08, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) {EM2880_R04_GPO, 0x0c, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) static const struct em28xx_reg_seq kworld_330u_analog[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) {EM2880_R04_GPO, 0x00, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) static const struct em28xx_reg_seq kworld_330u_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {EM2880_R04_GPO, 0x08, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * Evga inDtube
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * GPIO0 - Enable digital power (s5h1409) - low to enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * GPIO4 - xc3028 reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * GOP3 - s5h1409 reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static const struct em28xx_reg_seq evga_indtube_analog[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {EM2820_R08_GPIO_CTRL, 0x79, 0xff, 60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static const struct em28xx_reg_seq evga_indtube_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {EM2820_R08_GPIO_CTRL, 0x7a, 0xff, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {EM2880_R04_GPO, 0x04, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {EM2880_R04_GPO, 0x0c, 0xff, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * EM_GPIO_0 - currently unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * EM_GPIO_2 - currently unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * EM_GPIO_3 - currently unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * EM_GPIO_6 - currently unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * EM_GPIO_7 - currently unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static const struct em28xx_reg_seq kworld_a340_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static const struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /* Pinnacle Hybrid Pro eb1a:2881 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) static const struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) {EM2820_R08_GPIO_CTRL, 0xfd, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) static const struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {EM2880_R04_GPO, 0x04, 0xff, 100},/* zl10353 reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {EM2880_R04_GPO, 0x0c, 0xff, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {EM2880_R04_GPO, 0x00, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) {EM2880_R04_GPO, 0x08, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * PCTV HD Mini (80e) GPIOs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) * 0-5: not used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * 6: demod reset, active low
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * 7: LED on, active high
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static const struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {EM28XX_R06_I2C_CLK, 0x45, 0xff, 10}, /*400 KHz*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) {EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 100},/*Demod reset*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) {EM2874_R80_GPIO_P0_CTRL, 0x40, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) * eb1a:2868 Reddo DVB-C USB TV Box
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) * GPIO4 - CU1216L NIM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * Other GPIOs seems to be don't care.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) static const struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {EM2820_R08_GPIO_CTRL, 0xde, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) {EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {EM2820_R08_GPIO_CTRL, 0x7f, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {EM2820_R08_GPIO_CTRL, 0x6f, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /* Callback for the most boards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) static const struct em28xx_reg_seq default_tuner_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) {EM2820_R08_GPIO_CTRL, 0, EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /* Mute/unmute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) static const struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) {EM2820_R08_GPIO_CTRL, 5, 7, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) static const struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {EM2820_R08_GPIO_CTRL, 4, 7, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) static const struct em28xx_reg_seq compro_mute_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {EM2820_R08_GPIO_CTRL, 6, 7, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) /* Terratec AV350 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static const struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {EM2820_R08_GPIO_CTRL, 0xff, 0x7f, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static const struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static const struct em28xx_reg_seq silvercrest_reg_seq[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {EM2820_R08_GPIO_CTRL, 0x01, 0xf7, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static const struct em28xx_reg_seq vc211a_enable[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {EM2820_R08_GPIO_CTRL, 0xff, 0x07, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {EM2820_R08_GPIO_CTRL, 0xff, 0x0f, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {EM2820_R08_GPIO_CTRL, 0xff, 0x0b, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) static const struct em28xx_reg_seq dikom_dk300_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) {EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {EM2880_R04_GPO, 0x08, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* Reset for the most [digital] boards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) static const struct em28xx_reg_seq leadership_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) {EM2874_R80_GPIO_P0_CTRL, 0x70, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) static const struct em28xx_reg_seq leadership_reset[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) {EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {EM2874_R80_GPIO_P0_CTRL, 0xb0, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * 2013:024f PCTV nanoStick T2 290e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) * GPIO_6 - demod reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) * GPIO_7 - LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) static const struct em28xx_reg_seq pctv_290e[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) {EM2874_R80_GPIO_P0_CTRL, 0x40, 0xff, 80}, /* GPIO_6 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {EM2874_R80_GPIO_P0_CTRL, 0xc0, 0xff, 80}, /* GPIO_7 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) static const struct em28xx_reg_seq terratec_h5_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) {EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {EM2874_R80_GPIO_P0_CTRL, 0xf2, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) static const struct em28xx_reg_seq terratec_h5_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) {EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) {EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) * 2013:024f PCTV DVB-S2 Stick 460e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) * GPIO_0 - POWER_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * GPIO_1 - BOOST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * GPIO_2 - VUV_LNB (red LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * GPIO_3 - EXT_12V
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * GPIO_4 - INT_DEM (DEMOD GPIO_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * GPIO_5 - INT_LNB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * GPIO_6 - RESET_DEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * GPIO_7 - LED (green LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) static const struct em28xx_reg_seq pctv_460e[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {EM2874_R80_GPIO_P0_CTRL, 0x01, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) { 0x0d, 0xff, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) {EM2874_R80_GPIO_P0_CTRL, 0x41, 0xff, 50}, /* GPIO_6=1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) { 0x0d, 0x42, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {EM2874_R80_GPIO_P0_CTRL, 0x61, 0xff, 50}, /* GPIO_5=1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) static const struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10}, /* xc5000 reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) {EM2874_R80_GPIO_P0_CTRL, 0xf9, 0xff, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) * 2013:0258 PCTV DVB-S2 Stick (461e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) * GPIO 0 = POWER_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) * GPIO 1 = BOOST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) * GPIO 2 = VUV_LNB (red LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) * GPIO 3 = #EXT_12V
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) * GPIO 4 = INT_DEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) * GPIO 5 = INT_LNB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) * GPIO 6 = #RESET_DEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) * GPIO 7 = P07_LED (green LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) static const struct em28xx_reg_seq pctv_461e[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {EM2874_R80_GPIO_P0_CTRL, 0x7f, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) {0x0d, 0xff, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {EM2874_R80_GPIO_P0_CTRL, 0x3f, 0xff, 100}, /* reset demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {EM2874_R80_GPIO_P0_CTRL, 0x7f, 0xff, 200}, /* reset demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {0x0d, 0x42, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {EM2874_R80_GPIO_P0_CTRL, 0xeb, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) {EM2874_R5F_TS_ENABLE, 0x84, 0x84, 0}, /* parallel? | null discard */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) static const struct em28xx_reg_seq hauppauge_930c_gpio[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10}, /* xc5000 reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) {EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) static const struct em28xx_reg_seq hauppauge_930c_digital[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) {EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * 1b80:e425 MaxMedia UB425-TC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) * 1b80:e1cc Delock 61959
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * GPIO_6 - demod reset, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * GPIO_7 - LED, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) static const struct em28xx_reg_seq maxmedia_ub425_tc[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) {EM2874_R80_GPIO_P0_CTRL, 0x83, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {EM2874_R80_GPIO_P0_CTRL, 0xc3, 0xff, 100}, /* GPIO_6 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) {EM2874_R80_GPIO_P0_CTRL, 0x43, 0xff, 000}, /* GPIO_7 = 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) * 2304:0242 PCTV QuatroStick (510e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) * GPIO_2: decoder reset, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) * GPIO_4: decoder suspend, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) * GPIO_6: demod reset, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) * GPIO_7: LED, 1=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) static const struct em28xx_reg_seq pctv_510e[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) {EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) {EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * 2013:0251 PCTV QuatroStick nano (520e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * GPIO_2: decoder reset, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * GPIO_4: decoder suspend, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * GPIO_6: demod reset, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * GPIO_7: LED, 1=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) static const struct em28xx_reg_seq pctv_520e[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) {EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) {EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {EM2874_R80_GPIO_P0_CTRL, 0xd4, 0xff, 000}, /* GPIO_7 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * reg 0x80/0x84:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) * GPIO_0: capturing LED, 0=on, 1=off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * GPIO_2: AV mute button, 0=pressed, 1=unpressed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) * GPIO 3: illumination button, 0=pressed, 1=unpressed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * GPIO_6: illumination/flash LED, 0=on, 1=off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * reg 0x81/0x85:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) * GPIO_7: snapshot button, 0=pressed, 1=unpressed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) static const struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) {EM2820_R08_GPIO_CTRL, 0xf7, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xb2, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) { -1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) static const struct em28xx_reg_seq pctv_292e[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {0x0d, 0xff, 0xff, 950},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) {EM2874_R80_GPIO_P0_CTRL, 0xbd, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 410},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {EM2874_R80_GPIO_P0_CTRL, 0x7d, 0xff, 300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) {EM2874_R80_GPIO_P0_CTRL, 0x7c, 0xff, 60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) {0x0d, 0x42, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {EM2874_R5F_TS_ENABLE, 0x85, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) {-1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) static const struct em28xx_reg_seq terratec_t2_stick_hd[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {0x0d, 0xff, 0xff, 600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) {EM2874_R80_GPIO_P0_CTRL, 0xbc, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) {EM2874_R80_GPIO_P0_CTRL, 0xf8, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {0x0d, 0x42, 0xff, 1000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) {EM2874_R5F_TS_ENABLE, 0x85, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) {-1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) static const struct em28xx_reg_seq plex_px_bcud[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) {0x0d, 0xff, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) {EM2874_R50_IR_CONFIG, 0x01, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {EM28XX_R06_I2C_CLK, 0x40, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) {EM28XX_R12_VINENABLE, 0x20, 0x20, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {0x0d, 0x42, 0xff, 1000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) {EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) {EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {0x73, 0xfd, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) {-1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) * 2040:0265 Hauppauge WinTV-dualHD DVB Isoc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) * 2040:8265 Hauppauge WinTV-dualHD DVB Bulk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) * 2040:026d Hauppauge WinTV-dualHD ATSC/QAM Isoc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) * 2040:826d Hauppauge WinTV-dualHD ATSC/QAM Bulk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) * reg 0x80/0x84:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) * GPIO_0: Yellow LED tuner 1, 0=on, 1=off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) * GPIO_1: Green LED tuner 1, 0=on, 1=off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * GPIO_2: Yellow LED tuner 2, 0=on, 1=off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * GPIO_3: Green LED tuner 2, 0=on, 1=off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) * GPIO_5: Reset #2, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) * GPIO_6: Reset #1, 0=active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) static const struct em28xx_reg_seq hauppauge_dualhd_dvb[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {0x0d, 0xff, 0xff, 200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) {0x50, 0x04, 0xff, 300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) {EM2874_R80_GPIO_P0_CTRL, 0xbf, 0xff, 100}, /* demod 1 reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {EM2874_R80_GPIO_P0_CTRL, 0xdf, 0xff, 100}, /* demod 2 reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) {EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) {EM2874_R5F_TS_ENABLE, 0x00, 0xff, 50}, /* disable TS filters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) {EM2874_R5D_TS1_PKT_SIZE, 0x05, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) {EM2874_R5E_TS2_PKT_SIZE, 0x05, 0xff, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) {-1, -1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) * Button definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) static const struct em28xx_button std_snapshot_button[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) .role = EM28XX_BUTTON_SNAPSHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) .reg_r = EM28XX_R0C_USBSUSP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) .reg_clearing = EM28XX_R0C_USBSUSP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) .mask = EM28XX_R0C_USBSUSP_SNAPSHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) .inverted = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) {-1, 0, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) static const struct em28xx_button speedlink_vad_laplace_buttons[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .role = EM28XX_BUTTON_SNAPSHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) .reg_r = EM2874_R85_GPIO_P1_STATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) .mask = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) .role = EM28XX_BUTTON_ILLUMINATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) .reg_r = EM2874_R84_GPIO_P0_STATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) .mask = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) {-1, 0, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * LED definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) static struct em28xx_led speedlink_vad_laplace_leds[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) .role = EM28XX_LED_ANALOG_CAPTURING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) .gpio_mask = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) .role = EM28XX_LED_ILLUMINATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) .gpio_mask = 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) {-1, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) static struct em28xx_led kworld_ub435q_v3_leds[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) .role = EM28XX_LED_DIGITAL_CAPTURING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) .gpio_mask = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) {-1, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) static struct em28xx_led pctv_80e_leds[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .role = EM28XX_LED_DIGITAL_CAPTURING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) .gpio_mask = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) .inverted = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) {-1, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) static struct em28xx_led terratec_grabby_leds[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) .role = EM28XX_LED_ANALOG_CAPTURING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) .gpio_reg = EM2820_R08_GPIO_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) .gpio_mask = EM_GPIO_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) {-1, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) static struct em28xx_led hauppauge_dualhd_leds[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) .role = EM28XX_LED_DIGITAL_CAPTURING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) .gpio_mask = EM_GPIO_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) .role = EM28XX_LED_DIGITAL_CAPTURING_TS2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) .gpio_reg = EM2874_R80_GPIO_P0_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) .gpio_mask = EM_GPIO_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) .inverted = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) {-1, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) * Board definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) const struct em28xx_board em28xx_boards[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) [EM2750_BOARD_UNKNOWN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) .name = "EM2710/EM2750/EM2751 webcam grabber",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) .xclk = EM28XX_XCLK_FREQUENCY_20MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) .is_webcam = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) .vmux = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) .gpio = silvercrest_reg_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) [EM2800_BOARD_UNKNOWN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) .name = "Unknown EM2800 video grabber",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) .is_em2800 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) [EM2820_BOARD_UNKNOWN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) .name = "Unknown EM2750/28xx video grabber",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) .is_webcam = 1, /* To enable sensor probe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) [EM2882_BOARD_ZOLID_HYBRID_TV_STICK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) .name = ":ZOLID HYBRID TV STICK",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) .tuner_gpio = zolid_tuner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) .dvb_gpio = zolid_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) [EM2750_BOARD_DLCW_130] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) /* Beijing Huaqi Information Digital Technology Co., Ltd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) .name = "Huaqi DLCW-130",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) .xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) .is_webcam = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) .vmux = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) .name = "Kworld PVR TV 2800 RF",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) .tuner_type = TUNER_TEMIC_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) [EM2820_BOARD_GADMEI_TVR200] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) .name = "Gadmei TVR200",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) [EM2820_BOARD_TERRATEC_CINERGY_250] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) .name = "Terratec Cinergy 250 USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) .has_ir_i2c = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) [EM2820_BOARD_PINNACLE_USB_2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) .name = "Pinnacle PCTV USB 2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) .has_ir_i2c = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) .name = "Hauppauge WinTV USB 2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) .tuner_type = TUNER_PHILIPS_FM1236_MK3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) .tda9887_conf = TDA9887_PRESENT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) TDA9887_PORT1_ACTIVE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) TDA9887_PORT2_ACTIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) .has_msp34xx = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) .has_ir_i2c = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) .amux = MSP_INPUT_DEFAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) [EM2820_BOARD_DLINK_USB_TV] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) .name = "D-Link DUB-T210 TV Tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) .name = "Hercules Smart TV USB 2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) .name = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) [EM2820_BOARD_GADMEI_UTV310] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) .name = "Gadmei UTV310",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) .tuner_type = TUNER_TNF_5335MF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) .vmux = SAA7115_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) .name = "Leadtek Winfast USB II Deluxe",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) .has_ir_i2c = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) .tvaudio_addr = 0x58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) .tda9887_conf = TDA9887_PRESENT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) TDA9887_PORT2_ACTIVE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) TDA9887_QSS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) .adecoder = EM28XX_TVAUDIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) .vmux = SAA7115_COMPOSITE4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) .amux = EM28XX_AMUX_AUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) .vmux = SAA7115_COMPOSITE5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) .radio = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) .type = EM28XX_RADIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) .amux = EM28XX_AMUX_AUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) .name = "Videology 20K14XUSB USB2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) .is_webcam = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) .vmux = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) [EM2820_BOARD_SILVERCREST_WEBCAM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) .name = "Silvercrest Webcam 1.3mpix",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) .is_webcam = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) .vmux = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) .gpio = silvercrest_reg_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) [EM2821_BOARD_SUPERCOMP_USB_2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) .name = "Supercomp USB 2.0 TV",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) .tuner_type = TUNER_PHILIPS_FM1236_MK3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) .tda9887_conf = TDA9887_PRESENT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) TDA9887_PORT1_ACTIVE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) TDA9887_PORT2_ACTIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) [EM2821_BOARD_USBGEAR_VD204] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) .name = "Usbgear VD204v9",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) .tuner_type = TUNER_ABSENT, /* Capture only device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) [EM2860_BOARD_NETGMBH_CAM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) /* Beijing Huaqi Information Digital Technology Co., Ltd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) .name = "NetGMBH Cam",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) .is_webcam = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) .vmux = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) .name = "Typhoon DVD Maker",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) .tuner_type = TUNER_ABSENT, /* Capture only device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) [EM2860_BOARD_GADMEI_UTV330] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) .name = "Gadmei UTV330",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) .tuner_type = TUNER_TNF_5335MF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) [EM2861_BOARD_GADMEI_UTV330PLUS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) .name = "Gadmei UTV330+",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) .tuner_type = TUNER_TNF_5335MF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) .ir_codes = RC_MAP_GADMEI_RM008Z,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) .name = "Terratec Cinergy A Hybrid XS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) [EM2861_BOARD_KWORLD_PVRTV_300U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) .name = "KWorld PVRTV 300U",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) .name = "Yakumo MovieMixer",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) .tuner_type = TUNER_ABSENT, /* Capture only device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) [EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) .name = "EM2860/TVP5150 Reference Design",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) .tuner_type = TUNER_ABSENT, /* Capture only device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) .name = "Plextor ConvertX PX-TV100U",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) .tuner_type = TUNER_TNF_5335MF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) .xclk = EM28XX_XCLK_I2S_MSB_TIMING |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) .has_msp34xx = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) .gpio = pinnacle_hybrid_pro_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) .gpio = pinnacle_hybrid_pro_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) .gpio = pinnacle_hybrid_pro_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) /* Those boards with em2870 are DVB Only*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) [EM2870_BOARD_TERRATEC_XS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) .name = "Terratec Cinergy T XS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) [EM2870_BOARD_TERRATEC_XS_MT2060] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) .name = "Terratec Cinergy T XS (MT2060)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) .xclk = EM28XX_XCLK_IR_RC5_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) .tuner_type = TUNER_ABSENT, /* MT2060 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) [EM2870_BOARD_KWORLD_350U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) .name = "Kworld 350 U DVB-T",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) [EM2870_BOARD_KWORLD_355U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) .name = "Kworld 355 U DVB-T",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) .dvb_gpio = default_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) .name = "Pinnacle PCTV DVB-T",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) .tuner_type = TUNER_ABSENT, /* MT2060 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) /* djh - I have serious doubts this is right... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) .xclk = EM28XX_XCLK_IR_RC5_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) EM28XX_XCLK_FREQUENCY_10MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) [EM2870_BOARD_COMPRO_VIDEOMATE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) .name = "Compro, VideoMate U3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) .tuner_type = TUNER_ABSENT, /* MT2060 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) .name = "Terratec Hybrid XS Secam",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) .has_msp34xx = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) .dvb_gpio = terratec_cinergy_USB_XS_FR_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) .gpio = terratec_cinergy_USB_XS_FR_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) .gpio = terratec_cinergy_USB_XS_FR_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) .gpio = terratec_cinergy_USB_XS_FR_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) [EM2884_BOARD_TERRATEC_H5] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) .name = "Terratec Cinergy H5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) .tuner_type = TUNER_PHILIPS_TDA8290,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) .tuner_addr = 0x41,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) .tuner_gpio = terratec_h5_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) [EM2884_BOARD_TERRATEC_H6] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) .name = "Terratec Cinergy H6 rev. 2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) .tuner_type = TUNER_PHILIPS_TDA8290,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) .tuner_addr = 0x41,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) .tuner_gpio = terratec_h5_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) .name = "Hauppauge WinTV HVR 930C",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) #if 0 /* FIXME: Add analog support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) .tuner_type = TUNER_XC5000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) .tuner_addr = 0x41,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) .dvb_gpio = hauppauge_930c_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) .tuner_gpio = hauppauge_930c_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) .ir_codes = RC_MAP_HAUPPAUGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) [EM2884_BOARD_C3TECH_DIGITAL_DUO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) .name = "C3 Tech Digital Duo HDTV/SDTV USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) /* FIXME: Add analog support - need a saa7136 driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) .ir_codes = RC_MAP_EMPTY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) .dvb_gpio = c3tech_digital_duo_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) [EM2884_BOARD_CINERGY_HTC_STICK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) .name = "Terratec Cinergy HTC Stick",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) [EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) .name = "Elgato EyeTV Hybrid 2008 INT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) .name = "Hauppauge WinTV HVR 900",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) .dvb_gpio = hauppauge_wintv_hvr_900_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) .ir_codes = RC_MAP_HAUPPAUGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) .name = "Hauppauge WinTV HVR 900 (R2)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) .dvb_gpio = hauppauge_wintv_hvr_900R2_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) .ir_codes = RC_MAP_HAUPPAUGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) .name = "Hauppauge WinTV HVR 850",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) .dvb_gpio = hauppauge_wintv_hvr_900_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) .ir_codes = RC_MAP_HAUPPAUGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) .name = "Hauppauge WinTV HVR 950",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) .dvb_gpio = hauppauge_wintv_hvr_900_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) .ir_codes = RC_MAP_HAUPPAUGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) .name = "Pinnacle PCTV HD Pro Stick",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) .dvb_gpio = hauppauge_wintv_hvr_900_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) .name = "AMD ATI TV Wonder HD 600",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) .dvb_gpio = hauppauge_wintv_hvr_900_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) .ir_codes = RC_MAP_ATI_TV_WONDER_HD_600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) .name = "Terratec Hybrid XS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) .dvb_gpio = default_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) .ir_codes = RC_MAP_TERRATEC_CINERGY_XS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) * maybe there's a reason behind it why Terratec sells the Hybrid XS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) * as Prodigy XS with a different PID, let's keep it separated for now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) * maybe we'll need it later on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) .name = "Terratec Prodigy XS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) [EM2820_BOARD_MSI_VOX_USB_2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) .name = "MSI VOX USB 2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) .tda9887_conf = TDA9887_PRESENT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) TDA9887_PORT1_ACTIVE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) TDA9887_PORT2_ACTIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) .max_range_640_480 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) .vmux = SAA7115_COMPOSITE4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) [EM2800_BOARD_TERRATEC_CINERGY_200] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) .name = "Terratec Cinergy 200 USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) .is_em2800 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) .has_ir_i2c = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) .tuner_type = TUNER_LG_TALN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) [EM2800_BOARD_GRABBEEX_USB2800] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) .is_em2800 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) .tuner_type = TUNER_ABSENT, /* capture only board */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) [EM2800_BOARD_VC211A] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) .name = "Actionmaster/LinXcel/Digitus VC211A",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) .is_em2800 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) .tuner_type = TUNER_ABSENT, /* Capture-only board */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) .gpio = vc211a_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) .gpio = vc211a_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) .name = "Leadtek Winfast USB II",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) .is_em2800 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) [EM2800_BOARD_KWORLD_USB2800] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) .name = "Kworld USB2800",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) .is_em2800 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) .tuner_type = TUNER_PHILIPS_FCV1236D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) [EM2820_BOARD_PINNACLE_DVC_90] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) .name = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) .tuner_type = TUNER_ABSENT, /* capture only board */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) [EM2800_BOARD_VGEAR_POCKETTV] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) .name = "V-Gear PocketTV",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) .is_em2800 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) .name = "Pixelview PlayTV Box 4 USB 2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) .tuner_type = TUNER_YMEC_TVF_5533MF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) .aout = EM28XX_AOUT_MONO | /* I2S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) EM28XX_AOUT_MASTER, /* Line out pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) .name = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) .buttons = std_snapshot_button,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) .tuner_type = TUNER_YMEC_TVF_5533MF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) .aout = EM28XX_AOUT_MONO | /* I2S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) EM28XX_AOUT_MASTER, /* Line out pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) .name = "EM2860/SAA711X Reference Design",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) .buttons = std_snapshot_button,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) [EM2874_BOARD_LEADERSHIP_ISDBT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) EM28XX_I2C_FREQ_100_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) .xclk = EM28XX_XCLK_FREQUENCY_10MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) .name = "EM2874 Leadership ISDBT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) .tuner_gpio = leadership_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) .dvb_gpio = leadership_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) [EM2880_BOARD_MSI_DIGIVOX_AD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) .name = "MSI DigiVox A/D",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) .gpio = em2880_msi_digivox_ad_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) .gpio = em2880_msi_digivox_ad_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) .gpio = em2880_msi_digivox_ad_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) .name = "MSI DigiVox A/D II",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) .gpio = em2880_msi_digivox_ad_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) .gpio = em2880_msi_digivox_ad_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) .gpio = em2880_msi_digivox_ad_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) [EM2880_BOARD_KWORLD_DVB_305U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) .name = "KWorld DVB-T 305U",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) [EM2880_BOARD_KWORLD_DVB_310U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) .name = "KWorld DVB-T 310U",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) .dvb_gpio = default_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) }, { /* S-video has not been tested yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) [EM2882_BOARD_KWORLD_ATSC_315U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) .name = "KWorld ATSC 315U HDTV TV Box",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) .tuner_type = TUNER_THOMSON_DTT761X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) .tuner_gpio = em2882_kworld_315u_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) .dvb_gpio = em2882_kworld_315u_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) .ir_codes = RC_MAP_KWORLD_315U,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) /* FIXME: Analog mode - still not ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) .vmux = SAA7115_COMPOSITE2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) .gpio = em2882_kworld_315u_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) .gpio = em2882_kworld_315u_analog1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) .gpio = em2882_kworld_315u_analog1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) [EM2880_BOARD_EMPIRE_DUAL_TV] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) .name = "Empire dual TV",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) .dvb_gpio = default_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) [EM2881_BOARD_DNT_DA2_HYBRID] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) .name = "DNT DA2 Hybrid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) .valid = EM28XX_BOARD_NOT_VALIDATED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) .name = "Pinnacle Hybrid Pro",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) .dvb_gpio = pinnacle_hybrid_pro_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) .gpio = pinnacle_hybrid_pro_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) .gpio = pinnacle_hybrid_pro_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) .gpio = pinnacle_hybrid_pro_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) [EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) .name = "Pinnacle Hybrid Pro (330e)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) .dvb_gpio = hauppauge_wintv_hvr_900R2_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) [EM2882_BOARD_KWORLD_VS_DVBT] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) .name = "Kworld VS-DVB-T 323UR",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) .dvb_gpio = kworld_330u_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) .ir_codes = RC_MAP_KWORLD_315U,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) .name = "Terratec Cinergy Hybrid T USB XS (em2882)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) .dvb_gpio = hauppauge_wintv_hvr_900_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) .ir_codes = RC_MAP_TERRATEC_CINERGY_XS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) .gpio = hauppauge_wintv_hvr_900_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) [EM2882_BOARD_DIKOM_DK300] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) .name = "Dikom DK300",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) .dvb_gpio = dikom_dk300_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) .gpio = default_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) [EM2883_BOARD_KWORLD_HYBRID_330U] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) .name = "Kworld PlusTV HD Hybrid 330",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) .dvb_gpio = kworld_330u_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) EM28XX_I2C_EEPROM_ON_BOARD |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) EM28XX_I2C_EEPROM_KEY_VALID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) .gpio = kworld_330u_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) .gpio = kworld_330u_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) .gpio = kworld_330u_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) .name = "Compro VideoMate ForYou/Stereo",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) .tuner_type = TUNER_LG_PAL_NEW_TAPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) .tvaudio_addr = 0xb0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) .adecoder = EM28XX_TVAUDIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) .mute_gpio = compro_mute_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) .gpio = compro_unmute_tv_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) .gpio = compro_unmute_svid_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) .name = "Kaiomy TVnPC U2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) .vchannels = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) .tuner_addr = 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) .ir_codes = RC_MAP_KAIOMY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) .radio = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) .type = EM28XX_RADIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) [EM2860_BOARD_EASYCAP] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) .name = "Easy Cap Capture DC-60",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) .vchannels = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) [EM2820_BOARD_IODATA_GVMVP_SZ] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) .name = "IO-DATA GV-MVP/SZ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) .tuner_type = TUNER_PHILIPS_FM1236_MK3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) .tda9887_conf = TDA9887_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) }, { /* Composite has not been tested yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) }, { /* S-video has not been tested yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) [EM2860_BOARD_TERRATEC_GRABBY] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) .name = "Terratec Grabby",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) .vchannels = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) .buttons = std_snapshot_button,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) .leds = terratec_grabby_leds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) [EM2860_BOARD_TERRATEC_AV350] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) .name = "Terratec AV350",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) .vchannels = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) .mute_gpio = terratec_av350_mute_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) .gpio = terratec_av350_unmute_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) .gpio = terratec_av350_unmute_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) [EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) .name = "Elgato Video Capture",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) .tuner_type = TUNER_ABSENT, /* Capture only device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) [EM2882_BOARD_EVGA_INDTUBE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) .name = "Evga inDtube",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) .tuner_type = TUNER_XC2028,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) .mts_firmware = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) .dvb_gpio = evga_indtube_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) .ir_codes = RC_MAP_EVGA_INDTUBE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) .type = EM28XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) .vmux = TVP5150_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) .gpio = evga_indtube_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) .gpio = evga_indtube_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) .gpio = evga_indtube_analog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) * eb1a:2868 Empia EM2870 + Philips CU1216L NIM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) * (Philips TDA10023 + Infineon TUA6034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) [EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) .name = "Reddo DVB-C USB TV Box",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) .tuner_gpio = reddo_dvb_c_usb_box,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) * 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) * initially as the KWorld PlusTV 340U, then as the UB435-Q.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) [EM2870_BOARD_KWORLD_A340] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) .name = "KWorld PlusTV 340U or UB435-Q (ATSC)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) .dvb_gpio = kworld_a340_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) * 2013:024f PCTV nanoStick T2 290e.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) [EM28174_BOARD_PCTV_290E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) .name = "PCTV nanoStick T2 290e",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) EM28XX_I2C_FREQ_100_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) .tuner_gpio = pctv_290e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) * 2013:024f PCTV DVB-S2 Stick 460e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) [EM28174_BOARD_PCTV_460E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) .name = "PCTV DVB-S2 Stick (460e)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) .tuner_gpio = pctv_460e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) * eb1a:5006 Honestech VIDBOX NW03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) [EM2860_BOARD_HT_VIDBOX_NW03] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) .name = "Honestech Vidbox NW03",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) .vmux = SAA7115_SVIDEO3, /* S-VIDEO needs check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) * 1b80:e425 MaxMedia UB425-TC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) [EM2874_BOARD_MAXMEDIA_UB425_TC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) .name = "MaxMedia UB425-TC",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) .tuner_gpio = maxmedia_ub425_tc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) .ir_codes = RC_MAP_REDDO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) * 2304:0242 PCTV QuatroStick (510e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) [EM2884_BOARD_PCTV_510E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) .name = "PCTV QuatroStick (510e)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) .tuner_gpio = pctv_510e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) * 2013:0251 PCTV QuatroStick nano (520e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) [EM2884_BOARD_PCTV_520E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) .name = "PCTV QuatroStick nano (520e)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) .tuner_gpio = pctv_520e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) [EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) .name = "Terratec Cinergy HTC USB XS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) * 1b80:e1cc Delock 61959
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) * mostly the same as MaxMedia UB-425-TC but different remote
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) [EM2874_BOARD_DELOCK_61959] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) .name = "Delock 61959",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) .tuner_gpio = maxmedia_ub425_tc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) .ir_codes = RC_MAP_DELOCK_61959,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) * 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) [EM2874_BOARD_KWORLD_UB435Q_V2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) .name = "KWorld USB ATSC TV Stick UB435-Q V2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) .dvb_gpio = kworld_a340_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) .tuner_gpio = default_tuner_gpio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) * 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) [EM2874_BOARD_KWORLD_UB435Q_V3] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) .name = "KWorld USB ATSC TV Stick UB435-Q V3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) .tuner_gpio = kworld_ub435q_v3_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) EM28XX_I2C_FREQ_100_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) .leds = kworld_ub435q_v3_leds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) [EM2874_BOARD_PCTV_HD_MINI_80E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) .name = "Pinnacle PCTV HD Mini",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) .dvb_gpio = em2874_pctv_80e_digital,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) .decoder = EM28XX_NODECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) .leds = pctv_80e_leds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) * Empia EM2765 + OmniVision OV2640
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) [EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) .name = "SpeedLink Vicious And Devine Laplace webcam",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) .xclk = EM28XX_XCLK_FREQUENCY_24MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) EM28XX_I2C_FREQ_100_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) .is_webcam = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) .amux = EM28XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) .gpio = speedlink_vad_laplace_reg_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) .buttons = speedlink_vad_laplace_buttons,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) .leds = speedlink_vad_laplace_leds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) * 2013:0258 PCTV DVB-S2 Stick (461e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) * Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A8293
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) [EM28178_BOARD_PCTV_461E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) .name = "PCTV DVB-S2 Stick (461e)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) .tuner_gpio = pctv_461e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) * 2013:0259 PCTV DVB-S2 Stick (461e_v2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A8293
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) [EM28178_BOARD_PCTV_461E_V2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) .name = "PCTV DVB-S2 Stick (461e v2)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) .tuner_gpio = pctv_461e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) * 2013:025f PCTV tripleStick (292e).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) [EM28178_BOARD_PCTV_292E] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) .name = "PCTV tripleStick (292e)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) .tuner_gpio = pctv_292e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) [EM2861_BOARD_LEADTEK_VC100] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) .name = "Leadtek VC100",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) .tuner_type = TUNER_ABSENT, /* Capture only device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) .decoder = EM28XX_TVP5150,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) .vmux = TVP5150_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) .vmux = TVP5150_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) * eb1a:8179 Terratec Cinergy T2 Stick HD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2146
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) [EM28178_BOARD_TERRATEC_T2_STICK_HD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) .name = "Terratec Cinergy T2 Stick HD",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) .tuner_gpio = terratec_t2_stick_hd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) .ir_codes = RC_MAP_TERRATEC_SLIM_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) * 3275:0085 PLEX PX-BCUD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) * Empia EM28178, TOSHIBA TC90532XBG, Sharp QM1D1C0042
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) [EM28178_BOARD_PLEX_PX_BCUD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) .name = "PLEX PX-BCUD",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) .xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) .tuner_gpio = plex_px_bcud,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) * 2040:0265 Hauppauge WinTV-dualHD (DVB version) Isoc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) * 2040:8265 Hauppauge WinTV-dualHD (DVB version) Bulk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) * Empia EM28274, 2x Silicon Labs Si2168, 2x Silicon Labs Si2157
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) [EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) .name = "Hauppauge WinTV-dualHD DVB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) .tuner_gpio = hauppauge_dualhd_dvb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) .has_dual_ts = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) .ir_codes = RC_MAP_HAUPPAUGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) .leds = hauppauge_dualhd_leds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) * 2040:026d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Isoc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) * 2040:826d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Bulk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) * Empia EM28274, 2x LG LGDT3306A, 2x Silicon Labs Si2157
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) [EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) .name = "Hauppauge WinTV-dualHD 01595 ATSC/QAM",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) .def_i2c_bus = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) EM28XX_I2C_FREQ_400_KHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) .tuner_gpio = hauppauge_dualhd_dvb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) .has_dual_ts = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) .ir_codes = RC_MAP_HAUPPAUGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) .leds = hauppauge_dualhd_leds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) * 1b80:e349 Magix USB Videowandler-2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) * (same chips as Honestech VIDBOX NW03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) [EM2861_BOARD_MAGIX_VIDEOWANDLER2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) .name = "Magix USB Videowandler-2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) * 1f4d:1abe MyGica iGrabber
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) * (same as several other EM2860 devices)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) [EM2860_BOARD_MYGICA_IGRABBER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) .name = "MyGica iGrabber",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) .vchannels = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) .decoder = EM28XX_SAA711X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) .input = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) .type = EM28XX_VMUX_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) .vmux = SAA7115_COMPOSITE0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) .type = EM28XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) .vmux = SAA7115_SVIDEO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) .amux = EM28XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) EXPORT_SYMBOL_GPL(em28xx_boards);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) /* table of devices that work with this driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) struct usb_device_id em28xx_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) { USB_DEVICE(0xeb1a, 0x2750),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) .driver_info = EM2750_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) { USB_DEVICE(0xeb1a, 0x2751),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) .driver_info = EM2750_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) { USB_DEVICE(0xeb1a, 0x2800),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) .driver_info = EM2800_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) { USB_DEVICE(0xeb1a, 0x2710),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) { USB_DEVICE(0xeb1a, 0x2820),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) { USB_DEVICE(0xeb1a, 0x2821),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) { USB_DEVICE(0xeb1a, 0x2860),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) { USB_DEVICE(0xeb1a, 0x2861),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) { USB_DEVICE(0xeb1a, 0x2862),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) { USB_DEVICE(0xeb1a, 0x2863),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) { USB_DEVICE(0xeb1a, 0x2870),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) { USB_DEVICE(0xeb1a, 0x2881),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) { USB_DEVICE(0xeb1a, 0x2883), /* used by :Zolid Hybrid Tv Stick */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) { USB_DEVICE(0xeb1a, 0x2868),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) { USB_DEVICE(0xeb1a, 0x2875),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) .driver_info = EM2820_BOARD_UNKNOWN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) { USB_DEVICE(0xeb1a, 0x2885), /* MSI Digivox Trio */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) .driver_info = EM2884_BOARD_TERRATEC_H5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) { USB_DEVICE(0xeb1a, 0xe300),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) { USB_DEVICE(0xeb1a, 0xe303),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) { USB_DEVICE(0xeb1a, 0xe305),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) { USB_DEVICE(0xeb1a, 0xe310),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) { USB_DEVICE(0xeb1a, 0xa313),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) .driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) { USB_DEVICE(0xeb1a, 0xa316),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) { USB_DEVICE(0xeb1a, 0xe320),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) { USB_DEVICE(0xeb1a, 0xe323),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) { USB_DEVICE(0xeb1a, 0xe350),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) .driver_info = EM2870_BOARD_KWORLD_350U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) { USB_DEVICE(0xeb1a, 0xe355),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) .driver_info = EM2870_BOARD_KWORLD_355U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) { USB_DEVICE(0xeb1a, 0x2801),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) { USB_DEVICE(0xeb1a, 0xe357),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) .driver_info = EM2870_BOARD_KWORLD_355U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) { USB_DEVICE(0xeb1a, 0xe359),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) .driver_info = EM2870_BOARD_KWORLD_355U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) { USB_DEVICE(0x1b80, 0xe302), /* Kaiser Baas Video to DVD maker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) { USB_DEVICE(0x1b80, 0xe304), /* Kworld DVD Maker 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) { USB_DEVICE(0x0ccd, 0x0036),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) { USB_DEVICE(0x0ccd, 0x004c),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) { USB_DEVICE(0x0ccd, 0x004f),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) { USB_DEVICE(0x0ccd, 0x005e),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) { USB_DEVICE(0x0ccd, 0x0042),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) { USB_DEVICE(0x0ccd, 0x0043),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) .driver_info = EM2870_BOARD_TERRATEC_XS_MT2060 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) { USB_DEVICE(0x0ccd, 0x008e), /* Cinergy HTC USB XS Rev. 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) { USB_DEVICE(0x0ccd, 0x00ac), /* Cinergy HTC USB XS Rev. 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) { USB_DEVICE(0x0ccd, 0x10a2), /* H5 Rev. 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) .driver_info = EM2884_BOARD_TERRATEC_H5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) { USB_DEVICE(0x0ccd, 0x10ad), /* H5 Rev. 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) .driver_info = EM2884_BOARD_TERRATEC_H5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) { USB_DEVICE(0x0ccd, 0x10b6), /* H5 Rev. 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) .driver_info = EM2884_BOARD_TERRATEC_H5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) { USB_DEVICE(0x0ccd, 0x10b2), /* H6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) .driver_info = EM2884_BOARD_TERRATEC_H6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) { USB_DEVICE(0x0ccd, 0x0084),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) .driver_info = EM2860_BOARD_TERRATEC_AV350 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) { USB_DEVICE(0x0ccd, 0x0096),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) { USB_DEVICE(0x0ccd, 0x10AF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) { USB_DEVICE(0x0ccd, 0x00b2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) .driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) { USB_DEVICE(0x0fd9, 0x0018),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) .driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) { USB_DEVICE(0x0fd9, 0x0033),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) { USB_DEVICE(0x185b, 0x2870),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) { USB_DEVICE(0x185b, 0x2041),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) { USB_DEVICE(0x2040, 0x4200),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) { USB_DEVICE(0x2040, 0x4201),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) { USB_DEVICE(0x2040, 0x6500),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) { USB_DEVICE(0x2040, 0x6502),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) { USB_DEVICE(0x2040, 0x651f),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) { USB_DEVICE(0x2040, 0x0265),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) { USB_DEVICE(0x2040, 0x8265),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) { USB_DEVICE(0x2040, 0x026d),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) { USB_DEVICE(0x2040, 0x826d),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) { USB_DEVICE(0x0438, 0xb002),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) { USB_DEVICE(0x2001, 0xf112),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) .driver_info = EM2820_BOARD_DLINK_USB_TV },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) { USB_DEVICE(0x2304, 0x0207),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) { USB_DEVICE(0x2304, 0x0208),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) { USB_DEVICE(0x2304, 0x021a),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) { USB_DEVICE(0x2304, 0x0226),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) { USB_DEVICE(0x2304, 0x0227),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) { USB_DEVICE(0x2304, 0x023f),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) .driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) { USB_DEVICE(0x0413, 0x6023),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) { USB_DEVICE(0x093b, 0xa003),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) { USB_DEVICE(0x093b, 0xa005),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) { USB_DEVICE(0x04bb, 0x0515),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) { USB_DEVICE(0xeb1a, 0x50a6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) .driver_info = EM2860_BOARD_GADMEI_UTV330 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) { USB_DEVICE(0x1b80, 0xa340),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) .driver_info = EM2870_BOARD_KWORLD_A340 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) { USB_DEVICE(0x1b80, 0xe346),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) .driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) { USB_DEVICE(0x1b80, 0xe34c),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) .driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) { USB_DEVICE(0x2013, 0x024f),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) .driver_info = EM28174_BOARD_PCTV_290E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) { USB_DEVICE(0x2013, 0x024c),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) .driver_info = EM28174_BOARD_PCTV_460E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) { USB_DEVICE(0x2040, 0x1605),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) { USB_DEVICE(0x1b80, 0xe755),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) .driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) { USB_DEVICE(0xeb1a, 0x5006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) .driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) { USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) .driver_info = EM2860_BOARD_EASYCAP },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) { USB_DEVICE(0x1b80, 0xe425),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) .driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) { USB_DEVICE(0x1f4d, 0x1abe),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) .driver_info = EM2860_BOARD_MYGICA_IGRABBER },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) { USB_DEVICE(0x2304, 0x0242),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) .driver_info = EM2884_BOARD_PCTV_510E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) { USB_DEVICE(0x2013, 0x0251),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) .driver_info = EM2884_BOARD_PCTV_520E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) { USB_DEVICE(0x1b80, 0xe1cc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) .driver_info = EM2874_BOARD_DELOCK_61959 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) { USB_DEVICE(0x1ae7, 0x9003),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) { USB_DEVICE(0x1ae7, 0x9004),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) { USB_DEVICE(0x2013, 0x0258),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) .driver_info = EM28178_BOARD_PCTV_461E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) { USB_DEVICE(0x2013, 0x0461),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) .driver_info = EM28178_BOARD_PCTV_461E_V2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) { USB_DEVICE(0x2013, 0x0259),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) .driver_info = EM28178_BOARD_PCTV_461E_V2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) { USB_DEVICE(0x2013, 0x025f),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) .driver_info = EM28178_BOARD_PCTV_292E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) { USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) .driver_info = EM28178_BOARD_PCTV_292E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) { USB_DEVICE(0x2040, 0x0264), /* Hauppauge WinTV-soloHD Isoc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) .driver_info = EM28178_BOARD_PCTV_292E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) { USB_DEVICE(0x2040, 0x8264), /* Hauppauge OEM Generic WinTV-soloHD Bulk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) .driver_info = EM28178_BOARD_PCTV_292E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) { USB_DEVICE(0x2040, 0x8268), /* Hauppauge Retail WinTV-soloHD Bulk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) .driver_info = EM28178_BOARD_PCTV_292E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) { USB_DEVICE(0x0413, 0x6f07),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) .driver_info = EM2861_BOARD_LEADTEK_VC100 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) { USB_DEVICE(0xeb1a, 0x8179),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) .driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) { USB_DEVICE(0x3275, 0x0085),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) .driver_info = EM28178_BOARD_PLEX_PX_BCUD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) { USB_DEVICE(0xeb1a, 0x5051), /* Ion Video 2 PC MKII / Startech svid2usb23 / Raygo R12-41373 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) .driver_info = EM2860_BOARD_TVP5150_REFERENCE_DESIGN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) { USB_DEVICE(0x1b80, 0xe349), /* Magix USB Videowandler-2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) .driver_info = EM2861_BOARD_MAGIX_VIDEOWANDLER2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) MODULE_DEVICE_TABLE(usb, em28xx_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) * EEPROM hash table for devices with generic USB IDs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) static const struct em28xx_hash_table em28xx_eeprom_hash[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) /* P/N: SA 60002070465 Tuner: TVF7533-MF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) {0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) {0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) {0x85dd871e, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) /* I2C devicelist hash table for devices with generic USB IDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) static const struct em28xx_hash_table em28xx_i2c_hash[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) {0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) {0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) {0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) {0x27e10080, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) /* NOTE: introduce a separate hash table for devices with 16 bit eeproms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) struct em28xx_i2c_bus *i2c_bus = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) struct em28xx *dev = i2c_bus->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) static inline void em28xx_set_xclk_i2c_speed(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) const struct em28xx_board *board = &em28xx_boards[dev->model];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) u8 xclk = board->xclk, i2c_speed = board->i2c_speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) * Those are the default values for the majority of boards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) * Use those values if not specified otherwise at boards entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) if (!xclk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) xclk = EM28XX_XCLK_IR_RC5_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) EM28XX_XCLK_FREQUENCY_12MHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) em28xx_write_reg(dev, EM28XX_R0F_XCLK, xclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) if (!i2c_speed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) EM28XX_I2C_FREQ_100_KHZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) dev->i2c_speed = i2c_speed & 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) if (!dev->board.is_em2800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, i2c_speed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) static inline void em28xx_set_model(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) dev->board = em28xx_boards[dev->model];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) dev->has_msp34xx = dev->board.has_msp34xx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) dev->is_webcam = dev->board.is_webcam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) em28xx_set_xclk_i2c_speed(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) /* Should be initialized early, for I2C to work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) dev->def_i2c_bus = dev->board.def_i2c_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) * Wait until AC97_RESET reports the expected value reliably before proceeding.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) * We also check that two unrelated registers accesses don't return the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) * value to avoid premature return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) * This procedure helps ensuring AC97 register accesses are reliable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) static int em28xx_wait_until_ac97_features_equals(struct em28xx *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) int expected_feat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) unsigned long timeout = jiffies + msecs_to_jiffies(2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) int feat, powerdown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) while (time_is_after_jiffies(timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) feat = em28xx_read_ac97(dev, AC97_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) if (feat < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) return feat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) powerdown = em28xx_read_ac97(dev, AC97_POWERDOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) if (powerdown < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) return powerdown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) if (feat == expected_feat && feat != powerdown)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) dev_warn(&dev->intf->dev, "AC97 registers access is not reliable !\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) * Since em28xx_pre_card_setup() requires a proper dev->model,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) * this won't work for boards with generic PCI IDs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) static void em28xx_pre_card_setup(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) * Set the initial XCLK and I2C clock values based on the board
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) * definition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) em28xx_set_xclk_i2c_speed(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) /* request some modules */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) switch (dev->model) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) case EM2861_BOARD_PLEXTOR_PX_TV100U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) /* Sets the msp34xx I2S speed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) dev->i2s_speed = 2048000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) case EM2861_BOARD_KWORLD_PVRTV_300U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) case EM2880_BOARD_KWORLD_DVB_305U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) case EM2870_BOARD_COMPRO_VIDEOMATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) * TODO: someone can do some cleanup here...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) * not everything's needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) case EM2870_BOARD_TERRATEC_XS_MT2060:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) * this device needs some gpio writes to get the DVB-T
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) * demod work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) case EM2870_BOARD_PINNACLE_PCTV_DVB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) * this device needs some gpio writes to get the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) * DVB-T demod work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) case EM2820_BOARD_GADMEI_UTV310:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) case EM2820_BOARD_MSI_VOX_USB_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) /* enables audio for that devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) case EM2882_BOARD_KWORLD_ATSC_315U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) case EM2860_BOARD_KAIOMY_TVNPC_U2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) em28xx_write_regs(dev, 0x0d, "\x42", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) em28xx_write_regs(dev, 0x08, "\xfd", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) em28xx_write_regs(dev, 0x08, "\xff", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) em28xx_write_regs(dev, 0x08, "\x7f", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) em28xx_write_regs(dev, 0x08, "\x6b", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) case EM2860_BOARD_EASYCAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) em28xx_write_regs(dev, 0x08, "\xf8", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) case EM2820_BOARD_IODATA_GVMVP_SZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) msleep(70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) case EM2860_BOARD_TERRATEC_GRABBY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) * HACK?: Ensure AC97 register reading is reliable before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) * proceeding. In practice, this will wait about 1.6 seconds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) em28xx_wait_until_ac97_features_equals(dev, 0x6a90);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) em28xx_gpio_set(dev, dev->board.tuner_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) /* Unlock device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) em28xx_set_mode(dev, EM28XX_SUSPEND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) static int em28xx_hint_board(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) if (dev->is_webcam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) if (dev->em28xx_sensor == EM28XX_MT9V011) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) } else if (dev->em28xx_sensor == EM28XX_MT9M001 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) dev->em28xx_sensor == EM28XX_MT9M111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) dev->model = EM2750_BOARD_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) /* FIXME: IMPROVE ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) * HINT method: EEPROM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) * This method works only for boards with eeprom.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) * Uses a hash of all eeprom bytes. The hash should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) * unique for a vendor/tuner pair.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) * There are a high chance that tuners for different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) * video standards produce different hashes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) if (dev->hash == em28xx_eeprom_hash[i].hash) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) dev->model = em28xx_eeprom_hash[i].model;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) dev->tuner_type = em28xx_eeprom_hash[i].tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) "Your board has no unique USB ID.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) "A hint were successfully done, based on eeprom hash.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) "This method is not 100%% failproof.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) "If the board were misdetected, please email this log to:\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) "\tV4L Mailing List <linux-media@vger.kernel.org>\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) "Board detected as %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) em28xx_boards[dev->model].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) * HINT method: I2C attached devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) * This method works for all boards.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) * Uses a hash of i2c scanned devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) * Devices with the same i2c attached chips will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) * be considered equal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) * This method is less precise than the eeprom one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) /* user did not request i2c scanning => do it now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) if (!dev->i2c_hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) em28xx_do_i2c_scan(dev, dev->def_i2c_bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) dev->model = em28xx_i2c_hash[i].model;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) dev->tuner_type = em28xx_i2c_hash[i].tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) "Your board has no unique USB ID.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) "A hint were successfully done, based on i2c devicelist hash.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) "This method is not 100%% failproof.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) "If the board were misdetected, please email this log to:\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) "\tV4L Mailing List <linux-media@vger.kernel.org>\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) "Board detected as %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) em28xx_boards[dev->model].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) "Your board has no unique USB ID and thus need a hint to be detected.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) "You may try to use card=<n> insmod option to workaround that.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) "Please send an email with this log to:\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) "\tV4L Mailing List <linux-media@vger.kernel.org>\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) "Board eeprom hash is 0x%08lx\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) "Board i2c devicelist hash is 0x%08lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) dev->hash, dev->i2c_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) "Here is a list of valid choices for the card=<n> insmod option:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) for (i = 0; i < em28xx_bcount; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) " card=%d -> %s\n", i, em28xx_boards[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) static void em28xx_card_setup(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) int i, j, idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) bool duplicate_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) * If the device can be a webcam, seek for a sensor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) * If sensor is not found, then it isn't a webcam.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) if (dev->is_webcam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) em28xx_detect_sensor(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) if (dev->em28xx_sensor == EM28XX_NOSENSOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) /* NOTE: error/unknown sensor/no sensor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) dev->is_webcam = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) switch (dev->model) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) case EM2750_BOARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) case EM2820_BOARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) case EM2800_BOARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) * This occurs because they share identical USB vendor and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) * product IDs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) * What we do here is look up the EEPROM hash of the K-WORLD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) * and if it is found then we decide that we do not have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) * a DIGIVOX and reset the device to the K-WORLD instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) * This solution is only valid if they do not share eeprom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) * hash identities which has not been determined as yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) if (em28xx_hint_board(dev) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) dev_err(&dev->intf->dev, "Board not discovered\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) em28xx_set_model(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) em28xx_pre_card_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) em28xx_set_model(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) dev_info(&dev->intf->dev, "Identified as %s (card=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) dev->board.name, dev->model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) dev->tuner_type = em28xx_boards[dev->model].tuner_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) /* request some modules */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) switch (dev->model) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) struct tveeprom tv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) if (!dev->eedata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) #if defined(CONFIG_MODULES) && defined(MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) request_module("tveeprom");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) /* Call first TVeeprom */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) tveeprom_hauppauge_analog(&tv, dev->eedata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) dev->tuner_type = tv.tuner_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) dev->i2s_speed = 2048000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) dev->has_msp34xx = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) case EM2882_BOARD_KWORLD_ATSC_315U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) em28xx_write_reg(dev, 0x0d, 0x42);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) usleep_range(10000, 11000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) case EM2820_BOARD_KWORLD_PVRTV2800RF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) /* GPIO enables sound on KWORLD PVR TV 2800RF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) case EM2820_BOARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) case EM2800_BOARD_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) * This occurs because they share identical USB vendor and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) * product IDs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) * What we do here is look up the EEPROM hash of the K-WORLD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) * and if it is found then we decide that we do not have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) * a DIGIVOX and reset the device to the K-WORLD instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) * This solution is only valid if they do not share eeprom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) * hash identities which has not been determined as yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) case EM2880_BOARD_MSI_DIGIVOX_AD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) if (!em28xx_hint_board(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) em28xx_set_model(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) * In cases where we had to use a board hint, the call to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) * so make the call now so the analog GPIOs are set properly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) * before probing the i2c bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) em28xx_gpio_set(dev, dev->board.tuner_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) * This occurs because they share identical USB vendor and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) * product IDs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) * What we do here is look up the EEPROM hash of the Dikom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) * and if it is found then we decide that we do not have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) * a Kworld and reset the device to the Dikom instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) * This solution is only valid if they do not share eeprom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) * hash identities which has not been determined as yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) case EM2882_BOARD_KWORLD_VS_DVBT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) if (!em28xx_hint_board(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) em28xx_set_model(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) * In cases where we had to use a board hint, the call to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) * so make the call now so the analog GPIOs are set properly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) * before probing the i2c bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) em28xx_gpio_set(dev, dev->board.tuner_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) "\n\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) "The support for this board weren't valid yet.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) "Please send a report of having this working\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) "not to V4L mailing list (and/or to other addresses)\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) /* Free eeprom data memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) kfree(dev->eedata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) dev->eedata = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) /* Allow override tuner type by a module parameter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) if (tuner >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) dev->tuner_type = tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) * Dynamically generate a list of valid audio inputs for this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) * specific board, mapping them via enum em28xx_amux.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) for (i = 0; i < MAX_EM28XX_INPUT; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) if (!INPUT(i)->type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) /* Skip already mapped audio inputs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) duplicate_entry = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) for (j = 0; j < idx; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) if (INPUT(i)->amux == dev->amux_map[j]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) duplicate_entry = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) if (duplicate_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) dev->amux_map[idx++] = INPUT(i)->amux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) for (; idx < MAX_EM28XX_INPUT; idx++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) dev->amux_map[idx] = EM28XX_AMUX_UNUSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) memset(ctl, 0, sizeof(*ctl));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) ctl->fname = XC2028_DEFAULT_FIRMWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) ctl->max_len = 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) ctl->mts = em28xx_boards[dev->model].mts_firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) switch (dev->model) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) case EM2880_BOARD_EMPIRE_DUAL_TV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) case EM2882_BOARD_TERRATEC_HYBRID_XS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) case EM2880_BOARD_TERRATEC_HYBRID_XS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) case EM2881_BOARD_PINNACLE_HYBRID_PRO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) case EM2882_BOARD_ZOLID_HYBRID_TV_STICK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) ctl->demod = XC3028_FE_ZARLINK456;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) ctl->demod = XC3028_FE_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) ctl->demod = XC3028_FE_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) ctl->fname = XC3028L_DEFAULT_FIRMWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) /* FIXME: Better to specify the needed IF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) ctl->demod = XC3028_FE_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) case EM2883_BOARD_KWORLD_HYBRID_330U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) case EM2882_BOARD_DIKOM_DK300:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) case EM2882_BOARD_KWORLD_VS_DVBT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) ctl->demod = XC3028_FE_CHINA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) ctl->fname = XC2028_DEFAULT_FIRMWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) case EM2882_BOARD_EVGA_INDTUBE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) ctl->demod = XC3028_FE_CHINA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) ctl->fname = XC3028L_DEFAULT_FIRMWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) ctl->demod = XC3028_FE_OREN538;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) static void request_module_async(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) struct em28xx *dev = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) struct em28xx, request_module_wk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) * The em28xx extensions can be modules or builtin. If the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) * modules are already loaded or are built in, those extensions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) * can be initialised right now. Otherwise, the module init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) * code will do it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) * Devices with an audio-only intf also have a V4L/DVB/RC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) * intf. Don't register extensions twice on those devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) if (dev->is_audio_only) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) #if defined(CONFIG_MODULES) && defined(MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) request_module("em28xx-alsa");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) em28xx_init_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) #if defined(CONFIG_MODULES) && defined(MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) if (dev->has_video)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) request_module("em28xx-v4l");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) request_module("snd-usb-audio");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) request_module("em28xx-alsa");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) if (dev->board.has_dvb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) request_module("em28xx-dvb");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) if (dev->board.buttons ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) ((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) request_module("em28xx-rc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) #endif /* CONFIG_MODULES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) static void request_modules(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) INIT_WORK(&dev->request_module_wk, request_module_async);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) schedule_work(&dev->request_module_wk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) static void flush_request_modules(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) flush_work(&dev->request_module_wk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) static int em28xx_media_device_init(struct em28xx *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) struct usb_device *udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) #ifdef CONFIG_MEDIA_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) struct media_device *mdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) if (!mdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) if (udev->product)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) media_device_usb_init(mdev, udev, udev->product);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) else if (udev->manufacturer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) media_device_usb_init(mdev, udev, udev->manufacturer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) media_device_usb_init(mdev, udev, dev_name(&dev->intf->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) dev->media_dev = mdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) static void em28xx_unregister_media_device(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) #ifdef CONFIG_MEDIA_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) if (dev->media_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) media_device_unregister(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) media_device_cleanup(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) kfree(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) dev->media_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) * em28xx_release_resources()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) * unregisters the v4l2,i2c and usb devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) * called when the device gets disconnected or at module unload
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) static void em28xx_release_resources(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) struct usb_device *udev = interface_to_usbdev(dev->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) /*FIXME: I2C IR should be disconnected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) mutex_lock(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) em28xx_unregister_media_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) if (dev->def_i2c_bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) em28xx_i2c_unregister(dev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) em28xx_i2c_unregister(dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) if (dev->ts == PRIMARY_TS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) usb_put_dev(udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) /* Mark device as unused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) clear_bit(dev->devno, em28xx_devused);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) mutex_unlock(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) * em28xx_free_device() - Free em28xx device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) * @ref: struct kref for em28xx device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) * This is called when all extensions and em28xx core unregisters a device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) void em28xx_free_device(struct kref *ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) struct em28xx *dev = kref_to_dev(ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) dev_info(&dev->intf->dev, "Freeing device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) if (!dev->disconnected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) em28xx_release_resources(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) if (dev->ts == PRIMARY_TS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) kfree(dev->alt_max_pkt_size_isoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) EXPORT_SYMBOL_GPL(em28xx_free_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) * em28xx_init_dev()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) * allocates and inits the device structs, registers i2c bus and v4l device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) int minor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) const char *chip_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) dev->intf = intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) mutex_init(&dev->ctrl_urb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) spin_lock_init(&dev->slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) dev->em28xx_write_regs = em28xx_write_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) dev->em28xx_read_reg = em28xx_read_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) dev->em28xx_write_regs_req = em28xx_write_regs_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) dev->em28xx_read_reg_req = em28xx_read_reg_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) em28xx_set_model(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) dev->wait_after_write = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) /* Based on the Chip ID, set the device configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) if (retval > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) dev->chip_id = retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) switch (dev->chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) case CHIP_ID_EM2800:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) chip_name = "em2800";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) case CHIP_ID_EM2710:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) chip_name = "em2710";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) case CHIP_ID_EM2750:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) chip_name = "em2750";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) case CHIP_ID_EM2765:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) chip_name = "em2765";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) dev->wait_after_write = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) dev->is_em25xx = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) dev->eeprom_addrwidth_16bit = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) case CHIP_ID_EM2820:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) chip_name = "em2710/2820";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) if (le16_to_cpu(udev->descriptor.idVendor) == 0xeb1a) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) __le16 idProd = udev->descriptor.idProduct;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) if (le16_to_cpu(idProd) == 0x2710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) chip_name = "em2710";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) else if (le16_to_cpu(idProd) == 0x2820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) chip_name = "em2820";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) /* NOTE: the em2820 is used in webcams, too ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) case CHIP_ID_EM2840:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) chip_name = "em2840";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) case CHIP_ID_EM2860:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) chip_name = "em2860";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) case CHIP_ID_EM2870:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) chip_name = "em2870";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) dev->wait_after_write = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) case CHIP_ID_EM2874:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) chip_name = "em2874";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) dev->wait_after_write = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) dev->eeprom_addrwidth_16bit = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) case CHIP_ID_EM28174:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) chip_name = "em28174";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) dev->wait_after_write = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) dev->eeprom_addrwidth_16bit = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) case CHIP_ID_EM28178:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) chip_name = "em28178";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) dev->wait_after_write = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) dev->eeprom_addrwidth_16bit = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) case CHIP_ID_EM2883:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) chip_name = "em2882/3";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) dev->wait_after_write = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) case CHIP_ID_EM2884:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) chip_name = "em2884";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) dev->wait_after_write = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) dev->eeprom_addrwidth_16bit = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) if (!chip_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) dev_info(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) "unknown em28xx chip ID (%d)\n", dev->chip_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) dev_info(&dev->intf->dev, "chip ID is %s\n", chip_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) em28xx_media_device_init(dev, udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) if (dev->is_audio_only) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) retval = em28xx_audio_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) goto err_deinit_media;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) em28xx_init_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) em28xx_pre_card_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) rt_mutex_init(&dev->i2c_bus_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) /* register i2c bus 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) if (dev->board.is_em2800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) "%s: em28xx_i2c_register bus 0 - error [%d]!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) __func__, retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) goto err_deinit_media;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) /* register i2c bus 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) if (dev->def_i2c_bus) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) if (dev->is_em25xx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) retval = em28xx_i2c_register(dev, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) EM28XX_I2C_ALGO_EM25XX_BUS_B);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) retval = em28xx_i2c_register(dev, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) EM28XX_I2C_ALGO_EM28XX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) dev_err(&dev->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) "%s: em28xx_i2c_register bus 1 - error [%d]!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) __func__, retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) goto err_unreg_i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) /* Do board specific init and eeprom reading */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) em28xx_card_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) err_unreg_i2c:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) em28xx_i2c_unregister(dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) err_deinit_media:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) em28xx_unregister_media_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) static int em28xx_duplicate_dev(struct em28xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) int nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) struct em28xx *sec_dev = kmemdup(dev, sizeof(*sec_dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) if (!sec_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) dev->dev_next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) /* Check to see next free device and mark as used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) if (nr >= EM28XX_MAXBOARDS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) /* No free device slots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) dev_warn(&dev->intf->dev, ": Supports only %i em28xx boards.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) EM28XX_MAXBOARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) kfree(sec_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) dev->dev_next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) } while (test_and_set_bit(nr, em28xx_devused));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) sec_dev->devno = nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) snprintf(sec_dev->name, 28, "em28xx #%d", nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) sec_dev->dev_next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) dev->dev_next = sec_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) /* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) #define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) static void em28xx_check_usb_descriptor(struct em28xx *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) int alt, int ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) bool *has_vendor_audio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) bool *has_video,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) bool *has_dvb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) const struct usb_endpoint_descriptor *e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) int sizedescr, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) * NOTE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) * Old logic with support for isoc transfers only was:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) * 0x82 isoc => analog
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) * 0x83 isoc => audio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) * 0x84 isoc => digital
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) * New logic with support for bulk transfers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) * 0x82 isoc => analog
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) * 0x82 bulk => analog
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) * 0x83 isoc* => audio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) * 0x84 isoc => digital
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) * 0x84 bulk => analog or digital**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) * 0x85 isoc => digital TS2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) * 0x85 bulk => digital TS2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) * (*: audio should always be isoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) * (**: analog, if ep 0x82 is isoc, otherwise digital)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) * The new logic preserves backwards compatibility and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) * reflects the endpoint configurations we have seen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) * so far. But there might be devices for which this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) * logic is not sufficient...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) e = &intf->altsetting[alt].endpoint[ep].desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) if (!usb_endpoint_dir_in(e))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) sizedescr = le16_to_cpu(e->wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705) size = sizedescr & 0x7ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) if (udev->speed == USB_SPEED_HIGH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) size = size * hb_mult(sizedescr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) /* Only inspect input endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) switch (e->bEndpointAddress) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) case 0x82:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) *has_video = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) if (usb_endpoint_xfer_isoc(e)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) dev->analog_ep_isoc = e->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) dev->alt_max_pkt_size_isoc[alt] = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718) } else if (usb_endpoint_xfer_bulk(e)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) dev->analog_ep_bulk = e->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) case 0x83:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) if (usb_endpoint_xfer_isoc(e))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) *has_vendor_audio = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) dev_err(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) "error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) case 0x84:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) if (*has_video && (usb_endpoint_xfer_bulk(e))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) dev->analog_ep_bulk = e->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) if (usb_endpoint_xfer_isoc(e)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) if (size > dev->dvb_max_pkt_size_isoc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) * 2) some manufacturers (e.g. Terratec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) * disable endpoints by setting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) * wMaxPacketSize to 0 bytes for all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) * alt settings. So far, we've seen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) * this for DVB isoc endpoints only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) *has_dvb = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743) dev->dvb_ep_isoc = e->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) dev->dvb_max_pkt_size_isoc = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) dev->dvb_alt_isoc = alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) *has_dvb = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) dev->dvb_ep_bulk = e->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) case 0x85:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) if (usb_endpoint_xfer_isoc(e)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) if (size > dev->dvb_max_pkt_size_isoc_ts2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) dev->dvb_ep_isoc_ts2 = e->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) dev->dvb_max_pkt_size_isoc_ts2 = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) dev->dvb_alt_isoc = alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) dev->dvb_ep_bulk_ts2 = e->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) * em28xx_usb_probe()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) * checks for supported devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) static int em28xx_usb_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) struct usb_device *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) struct em28xx *dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) bool has_vendor_audio = false, has_video = false, has_dvb = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778) int i, nr, try_bulk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) const int ifnum = intf->altsetting[0].desc.bInterfaceNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) char *speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) udev = usb_get_dev(interface_to_usbdev(intf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) /* Check to see next free device and mark as used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) if (nr >= EM28XX_MAXBOARDS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) /* No free device slots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) dev_err(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) "Driver supports up to %i em28xx boards.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) EM28XX_MAXBOARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) goto err_no_slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) } while (test_and_set_bit(nr, em28xx_devused));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) /* Don't register audio interfaces */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) if (intf->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) dev_info(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) "audio device (%04x:%04x): interface %i, class %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801) le16_to_cpu(udev->descriptor.idVendor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) le16_to_cpu(udev->descriptor.idProduct),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) ifnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) intf->altsetting[0].desc.bInterfaceClass);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) /* allocate memory for our device state and initialize it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) dev = kzalloc(sizeof(*dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) if (!dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) /* compute alternate max packet sizes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) dev->alt_max_pkt_size_isoc = kcalloc(intf->num_altsetting,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) sizeof(dev->alt_max_pkt_size_isoc[0]),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) if (!dev->alt_max_pkt_size_isoc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) /* Get endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) for (i = 0; i < intf->num_altsetting; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) int ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) for (ep = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) ep < intf->altsetting[i].desc.bNumEndpoints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) ep++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) em28xx_check_usb_descriptor(dev, udev, intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) i, ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) &has_vendor_audio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) &has_video,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) &has_dvb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) if (!(has_vendor_audio || has_video || has_dvb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) switch (udev->speed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) case USB_SPEED_LOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) speed = "1.5";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) case USB_SPEED_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) case USB_SPEED_FULL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) speed = "12";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) case USB_SPEED_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) speed = "480";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) speed = "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) dev_info(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) "New device %s %s @ %s Mbps (%04x:%04x, interface %d, class %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) udev->manufacturer ? udev->manufacturer : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) udev->product ? udev->product : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) speed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) le16_to_cpu(udev->descriptor.idVendor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) le16_to_cpu(udev->descriptor.idProduct),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) ifnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) intf->altsetting->desc.bInterfaceNumber);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) * Make sure we have 480 Mbps of bandwidth, otherwise things like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) * video stream wouldn't likely work, since 12 Mbps is generally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) * not enough even for most Digital TV streams.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) dev_err(&intf->dev, "Device initialization failed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) dev_err(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) "Device must be connected to a high-speed USB 2.0 port.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) kref_init(&dev->ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) dev->devno = nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) dev->model = id->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) dev->alt = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) dev->has_video = has_video;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) dev->ifnum = ifnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) dev->ts = PRIMARY_TS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) snprintf(dev->name, 28, "em28xx");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) dev->dev_next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) if (has_vendor_audio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) dev_info(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) "Audio interface %i found (Vendor Class)\n", ifnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) /* Checks if audio is provided by a USB Audio Class intf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) struct usb_interface *uif = udev->config->interface[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) if (has_vendor_audio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) dev_err(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) "em28xx: device seems to have vendor AND usb audio class interfaces !\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) "\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) if (has_video)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) dev_info(&intf->dev, "Video interface %i found:%s%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) ifnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) dev->analog_ep_bulk ? " bulk" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) dev->analog_ep_isoc ? " isoc" : "");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) if (has_dvb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) dev_info(&intf->dev, "DVB interface %i found:%s%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) ifnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) dev->dvb_ep_bulk ? " bulk" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) dev->dvb_ep_isoc ? " isoc" : "");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) dev->num_alt = intf->num_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) if ((unsigned int)card[nr] < em28xx_bcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) dev->model = card[nr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) /* save our data pointer in this intf device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) usb_set_intfdata(intf, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) /* allocate device struct and check if the device is a webcam */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) mutex_init(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) retval = em28xx_init_dev(dev, udev, intf, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) if (usb_xfer_mode < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) if (dev->is_webcam)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) try_bulk = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) try_bulk = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) try_bulk = usb_xfer_mode > 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) /* Disable V4L2 if the device doesn't have a decoder or image sensor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) if (has_video &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) dev->board.decoder == EM28XX_NODECODER &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) dev->em28xx_sensor == EM28XX_NOSENSOR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) dev_err(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) "Currently, V4L2 is not supported on this model\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) has_video = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) dev->has_video = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) if (dev->board.has_dual_ts &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) (dev->tuner_type != TUNER_ABSENT || INPUT(0)->type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) * The logic with sets alternate is not ready for dual-tuners
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) * which analog modes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) dev_err(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) "We currently don't support analog TV or stream capture on dual tuners.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) has_video = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) /* Select USB transfer types to use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972) if (has_video) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) dev->analog_xfer_bulk = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) dev_info(&intf->dev, "analog set to %s mode.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) dev->analog_xfer_bulk ? "bulk" : "isoc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) if (has_dvb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) dev->dvb_xfer_bulk = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) dev_info(&intf->dev, "dvb set to %s mode.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) dev->dvb_xfer_bulk ? "bulk" : "isoc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) if (dev->board.has_dual_ts && em28xx_duplicate_dev(dev) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) kref_init(&dev->dev_next->ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) dev->dev_next->ts = SECONDARY_TS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) dev->dev_next->alt = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) dev->dev_next->is_audio_only = has_vendor_audio &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) !(has_video || has_dvb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) dev->dev_next->has_video = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) dev->dev_next->ifnum = ifnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) dev->dev_next->model = id->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) mutex_init(&dev->dev_next->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) retval = em28xx_init_dev(dev->dev_next, udev, intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) dev->dev_next->devno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) goto err_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) dev->dev_next->board.ir_codes = NULL; /* No IR for 2nd tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) dev->dev_next->board.has_ir_i2c = 0; /* No IR for 2nd tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) if (usb_xfer_mode < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) if (dev->dev_next->is_webcam)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) try_bulk = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) try_bulk = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) try_bulk = usb_xfer_mode > 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) /* Select USB transfer types to use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) if (has_dvb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016) if (!dev->dvb_ep_isoc_ts2 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) (try_bulk && dev->dvb_ep_bulk_ts2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) dev->dev_next->dvb_xfer_bulk = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) dev_info(&dev->intf->dev, "dvb ts2 set to %s mode.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) dev->dev_next->dvb_xfer_bulk ? "bulk" : "isoc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) dev->dev_next->dvb_ep_isoc = dev->dvb_ep_isoc_ts2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) dev->dev_next->dvb_ep_bulk = dev->dvb_ep_bulk_ts2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) dev->dev_next->dvb_max_pkt_size_isoc = dev->dvb_max_pkt_size_isoc_ts2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) dev->dev_next->dvb_alt_isoc = dev->dvb_alt_isoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) /* Configuare hardware to support TS2*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) if (dev->dvb_xfer_bulk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) /* The ep4 and ep5 are configuared for BULK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) em28xx_write_reg(dev, 0x0b, 0x96);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) mdelay(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) em28xx_write_reg(dev, 0x0b, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) mdelay(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036) /* The ep4 and ep5 are configuared for ISO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) em28xx_write_reg(dev, 0x0b, 0x96);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) mdelay(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) em28xx_write_reg(dev, 0x0b, 0x82);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) mdelay(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) request_modules(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) * Do it at the end, to reduce dynamic configuration changes during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) * the device init. Yet, as request_modules() can be async, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) * topology will likely change after the load of the em28xx subdrivers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) #ifdef CONFIG_MEDIA_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) retval = media_device_register(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) err_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) kfree(dev->alt_max_pkt_size_isoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) clear_bit(nr, em28xx_devused);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) err_no_slot:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) usb_put_dev(udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) * em28xx_usb_disconnect()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) * called when the device gets disconnected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) * video device will be unregistered on v4l2_close in case it is still open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) static void em28xx_usb_disconnect(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) struct em28xx *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) dev = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) usb_set_intfdata(intf, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) if (dev->dev_next) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) dev->dev_next->disconnected = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) dev_info(&dev->intf->dev, "Disconnecting %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) dev->dev_next->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) dev->disconnected = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) dev_info(&dev->intf->dev, "Disconnecting %s\n", dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) flush_request_modules(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) em28xx_close_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098) if (dev->dev_next)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) em28xx_release_resources(dev->dev_next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) em28xx_release_resources(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) if (dev->dev_next) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) kref_put(&dev->dev_next->ref, em28xx_free_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) dev->dev_next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) kref_put(&dev->ref, em28xx_free_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) static int em28xx_usb_suspend(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) pm_message_t message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) struct em28xx *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) dev = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) em28xx_suspend_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) static int em28xx_usb_resume(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) struct em28xx *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125) dev = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) em28xx_resume_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) static struct usb_driver em28xx_usb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) .name = "em28xx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) .probe = em28xx_usb_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) .disconnect = em28xx_usb_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) .suspend = em28xx_usb_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137) .resume = em28xx_usb_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) .reset_resume = em28xx_usb_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) .id_table = em28xx_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) module_usb_driver(em28xx_usb_driver);