^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) cx231xx-cards.c - driver for Conexant Cx23100/101/102
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) USB 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) 2008 <srinivasa.deevi at conexant dot com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) Based on em28xx driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "cx231xx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <media/tuner.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <media/tveeprom.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <media/v4l2-common.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <media/drv-intf/cx25840.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <media/dvb-usb-ids.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "xc5000.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "tda18271.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static int tuner = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) module_param(tuner, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) MODULE_PARM_DESC(tuner, "tuner type");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static int transfer_mode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) module_param(transfer_mode, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) MODULE_PARM_DESC(transfer_mode, "transfer mode (1-ISO or 0-BULK)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) static unsigned int disable_ir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) module_param(disable_ir, int, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static unsigned long cx231xx_devused;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * Reset sequences for analog/digital modes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) {0x03, 0x01, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {0x03, 0x00, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) {0x03, 0x01, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) {-1, -1, -1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * Board definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct cx231xx_board cx231xx_boards[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) [CX231XX_BOARD_UNKNOWN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .name = "Unknown CX231xx video grabber",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) [CX231XX_BOARD_CNXT_CARRAERA] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .name = "Conexant Hybrid TV - CARRAERA",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .tuner_type = TUNER_XC5000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .tuner_addr = 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .demod_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .demod_addr = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^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) [CX231XX_BOARD_CNXT_SHELBY] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .name = "Conexant Hybrid TV - SHELBY",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .tuner_type = TUNER_XC5000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) .tuner_addr = 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .demod_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .demod_addr = 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) [CX231XX_BOARD_CNXT_RDE_253S] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .name = "Conexant Hybrid TV - RDE253S",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) .agc_analog_digital_select_gpio = 0x1c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) .demod_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .demod_addr = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) [CX231XX_BOARD_CNXT_RDU_253S] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .name = "Conexant Hybrid TV - RDU253S",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .agc_analog_digital_select_gpio = 0x1c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .demod_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) .demod_addr = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) [CX231XX_BOARD_CNXT_VIDEO_GRABBER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) .name = "Conexant VIDEO GRABBER",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) .agc_analog_digital_select_gpio = 0x1c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .no_alt_vanc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .external_av = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* Actually, it has a 417, but it isn't working correctly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * So set to 0 for now until someone can manage to get this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * to work reliably. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .has_417 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) [CX231XX_BOARD_CNXT_RDE_250] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .name = "Conexant Hybrid TV - rde 250",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) .tuner_type = TUNER_XC5000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .tuner_addr = 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) .demod_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) .demod_addr = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) [CX231XX_BOARD_CNXT_RDU_250] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) .name = "Conexant Hybrid TV - RDU 250",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .tuner_type = TUNER_XC5000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) .tuner_addr = 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) .demod_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) .demod_addr = 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) .gpio = NULL,
^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) [CX231XX_BOARD_HAUPPAUGE_EXETER] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) .name = "Hauppauge EXETER",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) .tuner_i2c_master = I2C_1_MUX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) .demod_i2c_master = I2C_1_MUX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) .demod_addr = 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) [CX231XX_BOARD_HAUPPAUGE_USBLIVE2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) .name = "Hauppauge USB Live 2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .no_alt_vanc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) .external_av = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) [CX231XX_BOARD_KWORLD_UB430_USB_HYBRID] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) .name = "Kworld UB430 USB Hybrid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) .tuner_sif_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) .tuner_scl_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) .tuner_sda_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) .tuner_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) .ir_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) .demod_addr = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) .norm = V4L2_STD_PAL_M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) [CX231XX_BOARD_KWORLD_UB445_USB_HYBRID] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) .name = "Kworld UB445 USB Hybrid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .agc_analog_digital_select_gpio = 0x11, /* According with PV cxPolaris.inf file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .tuner_sif_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .tuner_scl_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) .tuner_sda_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) .tuner_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) .ir_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) .demod_addr = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) .norm = V4L2_STD_NTSC_M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) .gpio = NULL,
^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) [CX231XX_BOARD_PV_PLAYTV_USB_HYBRID] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) .name = "Pixelview PlayTV USB Hybrid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) .agc_analog_digital_select_gpio = 0x1c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) .tuner_sif_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) .tuner_scl_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) .tuner_sda_gpio = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) .tuner_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) .ir_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) .rc_map_name = RC_MAP_PIXELVIEW_002T,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) .demod_addr = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) .norm = V4L2_STD_PAL_M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) [CX231XX_BOARD_PV_XCAPTURE_USB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) .name = "Pixelview Xcapture USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) .no_alt_vanc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) .external_av = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) [CX231XX_BOARD_ICONBIT_U100] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) .name = "Iconbit Analog Stick U100 FM",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) .agc_analog_digital_select_gpio = 0x1C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) [CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) .name = "Hauppauge WinTV USB2 FM (PAL)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) [CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) .name = "Hauppauge WinTV USB2 FM (NTSC)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) .gpio = NULL,
^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) [CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) .name = "Elgato Video Capture V2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) .no_alt_vanc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) .external_av = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) [CX231XX_BOARD_OTG102] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) .name = "Geniatech OTG102",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) /* According with PV CxPlrCAP.inf file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) .no_alt_vanc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) .external_av = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) /*.has_417 = 1, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) /* This board is believed to have a hardware encoding chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * supporting mpeg1/2/4, but as the 417 is apparently not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) * working for the reference board it is not here either. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) [CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) .name = "Hauppauge WinTV 930C-HD (1113xx) / HVR-900H (111xxx) / PCTV QuatroStick 521e",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) .tuner_type = TUNER_NXP_TDA18271,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) .demod_addr = 0x64, /* 0xc8 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) [CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) .name = "Hauppauge WinTV 930C-HD (1114xx) / HVR-901H (1114xx) / PCTV QuatroStick 522e",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) .demod_addr = 0x64, /* 0xc8 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) [CX231XX_BOARD_HAUPPAUGE_955Q] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) .name = "Hauppauge WinTV-HVR-955Q (111401)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) .demod_addr = 0x59, /* 0xb2 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) [CX231XX_BOARD_TERRATEC_GRABBY] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) .name = "Terratec Grabby",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) .no_alt_vanc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) .external_av = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) [CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) .name = "Evromedia USB Full Hybrid Full HD",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) .demod_addr = 0x64, /* 0xc8 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) .tuner_addr = 0x60, /* 0xc0 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) .tuner_i2c_master = I2C_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) .vmux = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) [CX231XX_BOARD_ASTROMETA_T2HYBRID] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) .name = "Astrometa T2hybrid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) .agc_analog_digital_select_gpio = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) .ctl_pin_status_mask = 0xffffffc4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) .demod_addr = 0x18, /* 0x30 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) .demod_i2c_master = I2C_1_MUX_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) .gpio_pin_status_mask = 0xa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) .norm = V4L2_STD_NTSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) .tuner_addr = 0x3a, /* 0x74 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) .vmux = CX231XX_VIN_1_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) [CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) .name = "The Imaging Source DFG/USB2pro",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) .no_alt_vanc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) .external_av = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) .vmux = CX231XX_VIN_1_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) .vmux = CX231XX_VIN_2_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) (CX231XX_VIN_2_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) [CX231XX_BOARD_HAUPPAUGE_935C] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) .name = "Hauppauge WinTV-HVR-935C",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) .demod_addr = 0x64, /* 0xc8 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) .norm = V4L2_STD_PAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) [CX231XX_BOARD_HAUPPAUGE_975] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) .name = "Hauppauge WinTV-HVR-975",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) .tuner_type = TUNER_ABSENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) .tuner_addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) .tuner_gpio = RDE250_XCV_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) .tuner_sif_gpio = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) .tuner_scl_gpio = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) .tuner_sda_gpio = 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) .decoder = CX231XX_AVDECODER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) .output_mode = OUT_MODE_VIP11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) .demod_xfer_mode = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) .ctl_pin_status_mask = 0xFFFFFFC4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) .agc_analog_digital_select_gpio = 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) .gpio_pin_status_mask = 0x4001000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) .tuner_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) .demod_i2c_master = I2C_1_MUX_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) .has_dvb = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) .demod_addr = 0x59, /* 0xb2 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) .demod_addr2 = 0x64, /* 0xc8 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) .norm = V4L2_STD_ALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) .input = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) .type = CX231XX_VMUX_TELEVISION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) .vmux = CX231XX_VIN_3_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) .amux = CX231XX_AMUX_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) .type = CX231XX_VMUX_COMPOSITE1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) .vmux = CX231XX_VIN_2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) .type = CX231XX_VMUX_SVIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) .vmux = CX231XX_VIN_1_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) (CX231XX_VIN_1_2 << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) CX25840_SVIDEO_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) .amux = CX231XX_AMUX_LINE_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) .gpio = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) /* table of devices that work with this driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) struct usb_device_id cx231xx_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) {USB_DEVICE(0x1D19, 0x6109),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) {USB_DEVICE(0x0572, 0x5A3C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) .driver_info = CX231XX_BOARD_UNKNOWN},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) {USB_DEVICE(0x0572, 0x58A2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) {USB_DEVICE(0x0572, 0x58A1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) .driver_info = CX231XX_BOARD_CNXT_SHELBY},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) {USB_DEVICE(0x0572, 0x58A4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) .driver_info = CX231XX_BOARD_CNXT_RDE_253S},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) {USB_DEVICE(0x0572, 0x58A5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) .driver_info = CX231XX_BOARD_CNXT_RDU_253S},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) {USB_DEVICE(0x0572, 0x58A6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) {USB_DEVICE(0x0572, 0x589E),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) .driver_info = CX231XX_BOARD_CNXT_RDE_250},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) {USB_DEVICE(0x0572, 0x58A0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) .driver_info = CX231XX_BOARD_CNXT_RDU_250},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) /* AverMedia DVD EZMaker 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) {USB_DEVICE(0x07ca, 0xc039),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) {USB_DEVICE(0x2040, 0xb110),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) {USB_DEVICE(0x2040, 0xb111),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) {USB_DEVICE(0x2040, 0xb120),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) {USB_DEVICE(0x2040, 0xb123),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) {USB_DEVICE(0x2040, 0xb124),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) .driver_info = CX231XX_BOARD_HAUPPAUGE_955Q},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) {USB_DEVICE(0x2040, 0xb151),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) .driver_info = CX231XX_BOARD_HAUPPAUGE_935C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) {USB_DEVICE(0x2040, 0xb150),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) .driver_info = CX231XX_BOARD_HAUPPAUGE_975},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) {USB_DEVICE(0x2040, 0xb130),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) {USB_DEVICE(0x2040, 0xb131),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) /* Hauppauge WinTV-HVR-900-H */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) {USB_DEVICE(0x2040, 0xb138),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) /* Hauppauge WinTV-HVR-901-H */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) {USB_DEVICE(0x2040, 0xb139),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) {USB_DEVICE(0x2040, 0xb140),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) {USB_DEVICE(0x2040, 0xc200),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) /* PCTV QuatroStick 521e */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) {USB_DEVICE(0x2013, 0x0259),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) /* PCTV QuatroStick 522e */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) {USB_DEVICE(0x2013, 0x025e),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000, 0x4001),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) .driver_info = CX231XX_BOARD_PV_PLAYTV_USB_HYBRID},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) {USB_DEVICE(USB_VID_PIXELVIEW, 0x5014),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) .driver_info = CX231XX_BOARD_PV_XCAPTURE_USB},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) {USB_DEVICE(0x1b80, 0xe424),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) .driver_info = CX231XX_BOARD_KWORLD_UB430_USB_HYBRID},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) {USB_DEVICE(0x1b80, 0xe421),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) .driver_info = CX231XX_BOARD_KWORLD_UB445_USB_HYBRID},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) {USB_DEVICE(0x1f4d, 0x0237),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) .driver_info = CX231XX_BOARD_ICONBIT_U100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) {USB_DEVICE(0x0fd9, 0x0037),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) {USB_DEVICE(0x1f4d, 0x0102),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) .driver_info = CX231XX_BOARD_OTG102},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) {USB_DEVICE(USB_VID_TERRATEC, 0x00a6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) .driver_info = CX231XX_BOARD_TERRATEC_GRABBY},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) {USB_DEVICE(0x1b80, 0xd3b2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) .driver_info = CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) {USB_DEVICE(0x15f4, 0x0135),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) .driver_info = CX231XX_BOARD_ASTROMETA_T2HYBRID},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) {USB_DEVICE(0x199e, 0x8002),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) .driver_info = CX231XX_BOARD_THE_IMAGING_SOURCE_DFG_USB2_PRO},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) /* cx231xx_tuner_callback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) * will be used to reset XC5000 tuner using GPIO pin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) struct cx231xx *dev = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) if (dev->tuner_type == TUNER_XC5000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) if (command == XC5000_TUNER_RESET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) dev_dbg(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) "Tuner CB: RESET: cmd %d : tuner type %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) command, dev->tuner_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) msleep(330);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) } else if (dev->tuner_type == TUNER_NXP_TDA18271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) switch (command) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) case TDA18271_CALLBACK_CMD_AGC_ENABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) if (dev->model == CX231XX_BOARD_PV_PLAYTV_USB_HYBRID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) rc = cx231xx_set_agc_analog_digital_mux_select(dev, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) static void cx231xx_reset_out(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) cx231xx_set_gpio_value(dev, CX23417_RESET, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) cx231xx_set_gpio_value(dev, CX23417_RESET, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) static void cx231xx_enable_OSC(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) cx231xx_set_gpio_value(dev, CX23417_OSC_EN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) static void cx231xx_sleep_s5h1432(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) cx231xx_set_gpio_value(dev, SLEEP_S5H1432, 0);
^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) static inline void cx231xx_set_model(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) dev->board = cx231xx_boards[dev->model];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) /* Since cx231xx_pre_card_setup() requires a proper dev->model,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) * this won't work for boards with generic PCI IDs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) void cx231xx_pre_card_setup(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) dev_info(dev->dev, "Identified as %s (card=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) dev->board.name, dev->model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) if (CX231XX_BOARD_ASTROMETA_T2HYBRID == dev->model) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) /* turn on demodulator chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) cx231xx_set_gpio_value(dev, 0x03, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) /* set the direction for GPIO pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) if (dev->board.tuner_gpio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) if (dev->board.tuner_sif_gpio >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) /* request some modules if any required */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) /* set the mode to Analog mode initially */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) /* Unlock device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) static void cx231xx_config_tuner(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) struct tuner_setup tun_setup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) struct v4l2_frequency f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) if (dev->tuner_type == TUNER_ABSENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) tun_setup.type = dev->tuner_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) tun_setup.addr = dev->tuner_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) tun_setup.tuner_callback = cx231xx_tuner_callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) tuner_call(dev, tuner, s_type_addr, &tun_setup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) if (tun_setup.type == TUNER_XC5000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) static struct xc2028_ctrl ctrl = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) .fname = XC5000_DEFAULT_FIRMWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) .max_len = 64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) .demod = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) struct v4l2_priv_tun_config cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) .tuner = dev->tuner_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) .priv = &ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) tuner_call(dev, tuner, s_config, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) /* configure tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) f.tuner = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) f.type = V4L2_TUNER_ANALOG_TV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) f.frequency = 9076; /* just a magic number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) dev->ctl_freq = f.frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) call_all(dev, tuner, s_frequency, &f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) static int read_eeprom(struct cx231xx *dev, struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) u8 *eedata, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) u8 start_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) int len_todo = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) u8 *eedata_cur = eedata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct i2c_msg msg_write = { .addr = client->addr, .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) .buf = &start_offset, .len = 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) struct i2c_msg msg_read = { .addr = client->addr, .flags = I2C_M_RD };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) /* start reading at offset 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) ret = i2c_transfer(client->adapter, &msg_write, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) dev_err(dev->dev, "Can't read eeprom\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) while (len_todo > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) msg_read.len = (len_todo > 64) ? 64 : len_todo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) msg_read.buf = eedata_cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) ret = i2c_transfer(client->adapter, &msg_read, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) dev_err(dev->dev, "Can't read eeprom\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) eedata_cur += msg_read.len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) len_todo -= msg_read.len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) for (i = 0; i + 15 < len; i += 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) dev_dbg(dev->dev, "i2c eeprom %02x: %*ph\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) i, 16, &eedata[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) void cx231xx_card_setup(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) cx231xx_set_model(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) if (cx231xx_boards[dev->model].tuner_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) /* request some modules */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) if (dev->board.decoder == CX231XX_AVDECODER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) cx231xx_get_i2c_adap(dev, I2C_0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) "cx25840", 0x88 >> 1, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) if (dev->sd_cx25840 == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) "cx25840 subdev registration failure\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) cx25840_call(dev, core, load_fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) /* Initialize the tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) if (dev->board.tuner_type != TUNER_ABSENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) dev->board.tuner_i2c_master);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) tuner_i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) "tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) dev->tuner_addr, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (dev->sd_tuner == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) "tuner subdev registration failure\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) cx231xx_config_tuner(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) switch (dev->model) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) case CX231XX_BOARD_HAUPPAUGE_955Q:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) case CX231XX_BOARD_HAUPPAUGE_935C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) case CX231XX_BOARD_HAUPPAUGE_975:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) struct eeprom {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) struct tveeprom tvee;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) u8 eeprom[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) struct i2c_client client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) struct eeprom *e = kzalloc(sizeof(*e), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) if (e == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) "failed to allocate memory to read eeprom\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) e->client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) e->client.addr = 0xa0 >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) read_eeprom(dev, &e->client, e->eeprom, sizeof(e->eeprom));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) tveeprom_hauppauge_analog(&e->tvee, e->eeprom + 0xc0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) kfree(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) * cx231xx_config()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) * inits registers with sane defaults
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) int cx231xx_config(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) /* TBD need to add cx231xx specific code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) * cx231xx_config_i2c()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) * configure i2c attached devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) void cx231xx_config_i2c(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) /* u32 input = INPUT(dev->video_input)->vmux; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) call_all(dev, video, s_stream, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) static void cx231xx_unregister_media_device(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) #ifdef CONFIG_MEDIA_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) if (dev->media_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) media_device_unregister(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) media_device_cleanup(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) kfree(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) dev->media_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) * cx231xx_realease_resources()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) * unregisters the v4l2,i2c and usb devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) * called when the device gets disconnected or at module unload
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) void cx231xx_release_resources(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) cx231xx_ir_exit(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) cx231xx_release_analog_resources(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) cx231xx_remove_from_devlist(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) /* Release I2C buses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) cx231xx_dev_uninit(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) /* delete v4l2 device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) v4l2_device_unregister(&dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) cx231xx_unregister_media_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) usb_put_dev(dev->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) /* Mark device as unused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) clear_bit(dev->devno, &cx231xx_devused);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) static int cx231xx_media_device_init(struct cx231xx *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) struct usb_device *udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) #ifdef CONFIG_MEDIA_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) struct media_device *mdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) if (!mdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) media_device_usb_init(mdev, udev, dev->board.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) dev->media_dev = mdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) * cx231xx_init_dev()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) * allocates and inits the device structs, registers i2c bus and v4l device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) int minor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) int retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) unsigned int maxh, maxw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) dev->udev = udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) mutex_init(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) mutex_init(&dev->ctrl_urb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) mutex_init(&dev->gpio_i2c_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) mutex_init(&dev->i2c_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) spin_lock_init(&dev->video_mode.slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) spin_lock_init(&dev->vbi_mode.slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) spin_lock_init(&dev->sliced_cc_mode.slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) init_waitqueue_head(&dev->open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) init_waitqueue_head(&dev->wait_frame);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) init_waitqueue_head(&dev->wait_stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) /* Query cx231xx to find what pcb config it is related to */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) retval = initialize_cx231xx(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) dev_err(dev->dev, "Failed to read PCB config\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) /*To workaround error number=-71 on EP0 for VideoGrabber,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) need set alt here.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) cx231xx_set_alt_setting(dev, INDEX_VANC, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) /* Cx231xx pre card setup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) cx231xx_pre_card_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) retval = cx231xx_config(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) dev_err(dev->dev, "error configuring device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) /* set default norm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) dev->norm = dev->board.norm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) /* register i2c bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) retval = cx231xx_dev_init(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) "%s: cx231xx_i2c_register - errCode [%d]!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) __func__, retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) goto err_dev_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) /* Do board specific init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) cx231xx_card_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) /* configure the device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) cx231xx_config_i2c(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) maxw = norm_maxw(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) maxh = norm_maxh(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) /* set default image size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) dev->width = maxw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) dev->height = maxh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) dev->interlaced = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) dev->video_input = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) retval = cx231xx_config(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) dev_err(dev->dev, "%s: cx231xx_config - errCode [%d]!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) __func__, retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) goto err_dev_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) /* init video dma queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) INIT_LIST_HEAD(&dev->video_mode.vidq.active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) /* init vbi dma queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) /* Reset other chips required if they are tied up with GPIO pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) cx231xx_add_into_devlist(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) if (dev->board.has_417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) dev_info(dev->dev, "attach 417 %d\n", dev->model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) if (cx231xx_417_register(dev) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) "%s() Failed to register 417 on VID_B\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) retval = cx231xx_register_analog_devices(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) goto err_analog;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) cx231xx_ir_init(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) cx231xx_init_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) err_analog:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) cx231xx_unregister_media_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) cx231xx_release_analog_resources(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) cx231xx_remove_from_devlist(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) err_dev_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) cx231xx_dev_uninit(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) #if defined(CONFIG_MODULES) && defined(MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) static void request_module_async(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) struct cx231xx *dev = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) struct cx231xx, request_module_wk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) if (dev->has_alsa_audio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) request_module("cx231xx-alsa");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) if (dev->board.has_dvb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) request_module("cx231xx-dvb");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) static void request_modules(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) INIT_WORK(&dev->request_module_wk, request_module_async);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) schedule_work(&dev->request_module_wk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) static void flush_request_modules(struct cx231xx *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) flush_work(&dev->request_module_wk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) #define request_modules(dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) #define flush_request_modules(dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) #endif /* CONFIG_MODULES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) static int cx231xx_init_v4l2(struct cx231xx *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) struct usb_interface *interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) int isoc_pipe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) struct usb_interface *uif;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) int i, idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) /* Video Init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) /* compute alternate max packet sizes for video */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) idx = dev->current_pcb_config.hs_config_info[0].interface_info.video_index + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) if (idx >= dev->max_iad_interface_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) "Video PCB interface #%d doesn't exist\n", idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) uif = udev->actconfig->interface[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) dev->video_mode.num_alt = uif->num_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) dev_info(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) "video EndPoint Addr 0x%x, Alternate settings: %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) dev->video_mode.end_point_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) dev->video_mode.num_alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) dev->video_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->video_mode.num_alt, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) if (dev->video_mode.alt_max_pkt_size == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) for (i = 0; i < dev->video_mode.num_alt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) u16 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) dev_dbg(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) "Alternate setting %i, max size= %i\n", i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) dev->video_mode.alt_max_pkt_size[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) /* VBI Init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) idx = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) if (idx >= dev->max_iad_interface_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) "VBI PCB interface #%d doesn't exist\n", idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) uif = udev->actconfig->interface[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) dev->vbi_mode.end_point_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) uif->altsetting[0].endpoint[isoc_pipe].desc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) dev->vbi_mode.num_alt = uif->num_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) dev_info(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) "VBI EndPoint Addr 0x%x, Alternate settings: %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) dev->vbi_mode.end_point_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) dev->vbi_mode.num_alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) /* compute alternate max packet sizes for vbi */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) dev->vbi_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->vbi_mode.num_alt, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) if (dev->vbi_mode.alt_max_pkt_size == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) for (i = 0; i < dev->vbi_mode.num_alt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) u16 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) desc.wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) dev->vbi_mode.alt_max_pkt_size[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) dev_dbg(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) "Alternate setting %i, max size= %i\n", i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) dev->vbi_mode.alt_max_pkt_size[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) /* Sliced CC VBI init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) /* compute alternate max packet sizes for sliced CC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) idx = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) if (idx >= dev->max_iad_interface_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) dev_err(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) "Sliced CC PCB interface #%d doesn't exist\n", idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) uif = udev->actconfig->interface[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) dev->sliced_cc_mode.end_point_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) uif->altsetting[0].endpoint[isoc_pipe].desc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) dev->sliced_cc_mode.num_alt = uif->num_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) dev_info(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) "sliced CC EndPoint Addr 0x%x, Alternate settings: %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) dev->sliced_cc_mode.end_point_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) dev->sliced_cc_mode.num_alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) dev->sliced_cc_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->sliced_cc_mode.num_alt, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) if (dev->sliced_cc_mode.alt_max_pkt_size == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) u16 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) desc.wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) dev->sliced_cc_mode.alt_max_pkt_size[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) dev_dbg(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) "Alternate setting %i, max size= %i\n", i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) dev->sliced_cc_mode.alt_max_pkt_size[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) * cx231xx_usb_probe()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) * checks for supported devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) static int cx231xx_usb_probe(struct usb_interface *interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) struct usb_device *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) struct device *d = &interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) struct usb_interface *uif;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) struct cx231xx *dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) int retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) int nr = 0, ifnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) int i, isoc_pipe = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) char *speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) u8 idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) struct usb_interface_assoc_descriptor *assoc_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) ifnum = interface->altsetting[0].desc.bInterfaceNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) * Interface number 0 - IR interface (handled by mceusb driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) * Interface number 1 - AV interface (handled by this driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) if (ifnum != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) /* Check to see next free device and mark as used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) if (nr >= CX231XX_MAXBOARDS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) /* No free device slots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) dev_err(d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) "Supports only %i devices.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) CX231XX_MAXBOARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) } while (test_and_set_bit(nr, &cx231xx_devused));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) udev = usb_get_dev(interface_to_usbdev(interface));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) /* allocate memory for our device state and initialize it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) dev = devm_kzalloc(&udev->dev, sizeof(*dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) if (dev == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) goto err_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) snprintf(dev->name, 29, "cx231xx #%d", nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) dev->devno = nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) dev->model = id->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) dev->video_mode.alt = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) dev->dev = d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) cx231xx_set_model(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) dev->interface_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) /* reset gpio dir and value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) dev->gpio_dir = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) dev->gpio_val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) dev->xc_fw_load_done = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) dev->has_alsa_audio = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) dev->power_mode = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) atomic_set(&dev->devlist_count, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) /* 0 - vbi ; 1 -sliced cc mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) dev->vbi_or_sliced_cc_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) /* get maximum no.of IAD interfaces */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) dev->max_iad_interface_count = udev->config->desc.bNumInterfaces;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) /* init CIR module TBD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) /*mode_tv: digital=1 or analog=0*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) dev->mode_tv = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) dev->USE_ISO = transfer_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) switch (udev->speed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) case USB_SPEED_LOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) speed = "1.5";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) case USB_SPEED_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) case USB_SPEED_FULL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) speed = "12";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) case USB_SPEED_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) speed = "480";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) speed = "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) dev_info(d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) "New device %s %s @ %s Mbps (%04x:%04x) with %d interfaces\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) udev->manufacturer ? udev->manufacturer : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) udev->product ? udev->product : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) speed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) le16_to_cpu(udev->descriptor.idVendor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) le16_to_cpu(udev->descriptor.idProduct),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) dev->max_iad_interface_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) /* increment interface count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) dev->interface_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) /* get device number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) nr = dev->devno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) assoc_desc = udev->actconfig->intf_assoc[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) if (!assoc_desc || assoc_desc->bFirstInterface != ifnum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) dev_err(d, "Not found matching IAD interface\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) goto err_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) dev_dbg(d, "registering interface %d\n", ifnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) /* save our data pointer in this interface device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) usb_set_intfdata(interface, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) /* Initialize the media controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) retval = cx231xx_media_device_init(dev, udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) dev_err(d, "cx231xx_media_device_init failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) goto err_media_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) /* Create v4l2 device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) #ifdef CONFIG_MEDIA_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) dev->v4l2_dev.mdev = dev->media_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) dev_err(d, "v4l2_device_register failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) goto err_v4l2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) /* allocate device struct */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) retval = cx231xx_init_dev(dev, udev, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) goto err_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) retval = cx231xx_init_v4l2(dev, udev, interface, isoc_pipe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) goto err_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) if (dev->current_pcb_config.ts1_source != 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) /* compute alternate max packet sizes for TS1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) idx = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) if (idx >= dev->max_iad_interface_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) dev_err(d, "TS1 PCB interface #%d doesn't exist\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) goto err_video_alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) uif = udev->actconfig->interface[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) goto err_video_alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) dev->ts1_mode.end_point_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) uif->altsetting[0].endpoint[isoc_pipe].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) desc.bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) dev->ts1_mode.num_alt = uif->num_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) dev_info(d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) "TS EndPoint Addr 0x%x, Alternate settings: %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) dev->ts1_mode.end_point_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) dev->ts1_mode.num_alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) dev->ts1_mode.alt_max_pkt_size = devm_kmalloc_array(&udev->dev, 32, dev->ts1_mode.num_alt, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) if (dev->ts1_mode.alt_max_pkt_size == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) goto err_video_alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) for (i = 0; i < dev->ts1_mode.num_alt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) u16 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) goto err_video_alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) tmp = le16_to_cpu(uif->altsetting[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) endpoint[isoc_pipe].desc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) dev->ts1_mode.alt_max_pkt_size[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) dev_dbg(d, "Alternate setting %i, max size= %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) i, dev->ts1_mode.alt_max_pkt_size[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) cx231xx_enable_OSC(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) cx231xx_reset_out(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) if (dev->model == CX231XX_BOARD_CNXT_RDE_253S)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) cx231xx_sleep_s5h1432(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) /* load other modules required */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) request_modules(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) #ifdef CONFIG_MEDIA_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) /* Init entities at the Media Controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) cx231xx_v4l2_create_entities(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) retval = v4l2_mc_create_media_graph(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) if (!retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) retval = media_device_register(dev->media_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) if (retval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) cx231xx_release_resources(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) err_video_alt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) /* cx231xx_uninit_dev: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) cx231xx_close_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) cx231xx_ir_exit(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) cx231xx_release_analog_resources(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) cx231xx_417_unregister(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) cx231xx_remove_from_devlist(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) cx231xx_dev_uninit(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) err_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) v4l2_device_unregister(&dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) err_v4l2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) cx231xx_unregister_media_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) err_media_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) usb_set_intfdata(interface, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) err_if:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) usb_put_dev(udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) clear_bit(nr, &cx231xx_devused);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) * cx231xx_usb_disconnect()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) * called when the device gets disconnected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) * video device will be unregistered on v4l2_close in case it is still open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) static void cx231xx_usb_disconnect(struct usb_interface *interface)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) struct cx231xx *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) dev = usb_get_intfdata(interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) usb_set_intfdata(interface, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) if (!dev->udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) dev->state |= DEV_DISCONNECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) flush_request_modules(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) /* wait until all current v4l2 io is finished then deallocate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) resources */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) mutex_lock(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) wake_up_interruptible_all(&dev->open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) if (dev->users) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) dev_warn(dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) "device %s is open! Deregistration and memory deallocation are deferred on close.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) video_device_node_name(&dev->vdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) /* Even having users, it is safe to remove the RC i2c driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) cx231xx_ir_exit(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) if (dev->USE_ISO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) cx231xx_uninit_isoc(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) cx231xx_uninit_bulk(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) wake_up_interruptible(&dev->wait_frame);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) wake_up_interruptible(&dev->wait_stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) cx231xx_close_extension(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) mutex_unlock(&dev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) if (!dev->users)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) cx231xx_release_resources(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) static struct usb_driver cx231xx_usb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) .name = "cx231xx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) .probe = cx231xx_usb_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) .disconnect = cx231xx_usb_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) .id_table = cx231xx_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) module_usb_driver(cx231xx_usb_driver);