^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2005-2006 Micronas USA Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/wait.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/usb.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 <asm/byteorder.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <media/i2c/saa7115.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <media/tuner.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <media/i2c/uda1342.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include "go7007-priv.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static unsigned int assume_endura;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) module_param(assume_endura, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) MODULE_PARM_DESC(assume_endura,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) "when probing fails, hardware is a Pelco Endura");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* #define GO7007_I2C_DEBUG */ /* for debugging the EZ-USB I2C adapter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define HPI_STATUS_ADDR 0xFFF4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define INT_PARAM_ADDR 0xFFF6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define INT_INDEX_ADDR 0xFFF8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * Pipes on EZ-USB interface:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * 0 snd - Control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * 0 rcv - Control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * 2 snd - Download firmware (control)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * 4 rcv - Read Interrupt (interrupt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * 6 rcv - Read Video (bulk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * 8 rcv - Read Audio (bulk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define GO7007_USB_EZUSB (1<<0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define GO7007_USB_EZUSB_I2C (1<<1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct go7007_usb_board {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) unsigned int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct go7007_board_info main_info;
^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) struct go7007_usb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) const struct go7007_usb_board *board;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct mutex i2c_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct usb_device *usbdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct urb *video_urbs[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct urb *audio_urbs[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct urb *intr_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /*********************** Product specification data ***********************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) static const struct go7007_usb_board board_matrix_ii = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .flags = GO7007_USB_EZUSB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .flags = GO7007_BOARD_HAS_AUDIO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) GO7007_BOARD_USE_ONBOARD_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .audio_rate = 48000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) GO7007_SENSOR_VALID_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) GO7007_SENSOR_TV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) GO7007_SENSOR_SAA7115 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) GO7007_SENSOR_VBI |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) GO7007_SENSOR_SCALING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .type = "saa7115",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .addr = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .num_inputs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .video_input = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .video_input = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .name = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .video_config = SAA7115_IDQ_IS_DEFAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static const struct go7007_usb_board board_matrix_reload = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .flags = GO7007_USB_EZUSB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .flags = GO7007_BOARD_HAS_AUDIO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) GO7007_BOARD_USE_ONBOARD_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) GO7007_AUDIO_I2S_MASTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .audio_rate = 48000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) GO7007_SENSOR_TV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .type = "saa7113",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .addr = 0x25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .num_inputs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .video_input = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .video_input = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .name = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .video_config = SAA7115_IDQ_IS_DEFAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) static const struct go7007_usb_board board_star_trek = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .flags = GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .flags = GO7007_BOARD_HAS_AUDIO, /* |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) GO7007_BOARD_HAS_TUNER, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) GO7007_SENSOR_VALID_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) GO7007_SENSOR_TV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) GO7007_SENSOR_SAA7115 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) GO7007_SENSOR_VBI |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) GO7007_SENSOR_SCALING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) .type = "saa7115",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .addr = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .num_inputs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /* {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * .video_input = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * .audio_index = AUDIO_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * .name = "Tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .video_input = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /* .audio_index = AUDIO_EXTERN, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .video_input = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /* .audio_index = AUDIO_EXTERN, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .name = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) .video_config = SAA7115_IDQ_IS_DEFAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static const struct go7007_usb_board board_px_tv402u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .flags = GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) .flags = GO7007_BOARD_HAS_AUDIO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) GO7007_BOARD_HAS_TUNER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) GO7007_SENSOR_VALID_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) GO7007_SENSOR_TV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) GO7007_SENSOR_SAA7115 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) GO7007_SENSOR_VBI |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) GO7007_SENSOR_SCALING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .num_i2c_devs = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) .type = "saa7115",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .addr = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) .type = "uda1342",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .addr = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .is_audio = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .type = "tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) .addr = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) .type = "tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) .addr = 0x43,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) .type = "sony-btf-mpx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) .addr = 0x44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) .num_inputs = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) .video_input = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) .audio_index = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) .name = "Tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) .video_input = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) .audio_index = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) .video_input = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) .audio_index = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .name = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) .video_config = SAA7115_IDQ_IS_DEFAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) .num_aud_inputs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .aud_inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .audio_input = UDA1342_IN2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) .name = "Tuner",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .audio_input = UDA1342_IN1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) .name = "Line In",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) static const struct go7007_usb_board board_xmen = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) .flags = GO7007_BOARD_USE_ONBOARD_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) .hpi_buffer_cap = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) .sensor_flags = GO7007_SENSOR_VREF_POLAR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) .sensor_width = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) .sensor_height = 240,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .sensor_framerate = 30030,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) .audio_flags = GO7007_AUDIO_ONE_CHANNEL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) GO7007_AUDIO_I2S_MODE_3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) GO7007_AUDIO_WORD_14 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) GO7007_AUDIO_I2S_MASTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) GO7007_AUDIO_BCLK_POLAR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) GO7007_AUDIO_OKI_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .audio_rate = 8000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .audio_bclk_div = 48,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) .audio_main_div = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .type = "ov7640",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .addr = 0x21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) .num_inputs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .name = "Camera",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) static const struct go7007_usb_board board_matrix_revolution = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) .flags = GO7007_USB_EZUSB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) .flags = GO7007_BOARD_HAS_AUDIO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) GO7007_BOARD_USE_ONBOARD_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) GO7007_AUDIO_I2S_MASTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .audio_rate = 48000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) GO7007_SENSOR_TV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) GO7007_SENSOR_VBI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) .type = "tw9903",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) .addr = 0x44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) .num_inputs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) .video_input = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) .video_input = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) .name = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) static const struct go7007_usb_board board_lifeview_lr192 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) .flags = GO7007_USB_EZUSB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) .flags = GO7007_BOARD_HAS_AUDIO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) GO7007_BOARD_USE_ONBOARD_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) .audio_rate = 48000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) GO7007_SENSOR_VALID_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) GO7007_SENSOR_TV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) GO7007_SENSOR_VBI |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) GO7007_SENSOR_SCALING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) .num_i2c_devs = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) .num_inputs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) .video_input = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) static const struct go7007_usb_board board_endura = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) GO7007_AUDIO_I2S_MASTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) .audio_rate = 8000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) .audio_bclk_div = 48,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) .audio_main_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) .hpi_buffer_cap = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) GO7007_SENSOR_TV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) .sensor_h_offset = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) .num_i2c_devs = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .num_inputs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .name = "Camera",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) static const struct go7007_usb_board board_adlink_mpg24 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) .flags = GO7007_BOARD_USE_ONBOARD_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) GO7007_AUDIO_I2S_MASTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) .audio_rate = 48000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) .hpi_buffer_cap = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) GO7007_SENSOR_TV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) GO7007_SENSOR_VBI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) .type = "tw2804",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) .addr = 0x00, /* yes, really */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .flags = I2C_CLIENT_TEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .num_inputs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) static const struct go7007_usb_board board_sensoray_2250 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) .flags = GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) GO7007_AUDIO_I2S_MASTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) .flags = GO7007_BOARD_HAS_AUDIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) .audio_rate = 48000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) GO7007_SENSOR_TV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) .type = "s2250",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) .addr = 0x43,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .is_audio = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .num_inputs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) .video_input = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .video_input = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) .name = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .num_aud_inputs = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .aud_inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) .audio_input = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) .name = "Line In",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) .audio_input = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) .name = "Mic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) .audio_input = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) .name = "Mic Boost",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) },
^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) static const struct go7007_usb_board board_ads_usbav_709 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) .flags = GO7007_USB_EZUSB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) .main_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) .flags = GO7007_BOARD_HAS_AUDIO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) GO7007_BOARD_USE_ONBOARD_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) GO7007_AUDIO_I2S_MASTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) GO7007_AUDIO_WORD_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) .audio_rate = 48000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) .audio_bclk_div = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) .audio_main_div = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) .hpi_buffer_cap = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) .sensor_flags = GO7007_SENSOR_656 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) GO7007_SENSOR_TV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) GO7007_SENSOR_VBI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) .num_i2c_devs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) .i2c_devs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) .type = "tw9906",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) .is_video = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) .addr = 0x44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .num_inputs = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) .inputs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) .video_input = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) .name = "Composite",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) .video_input = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) .name = "S-Video",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) static const struct usb_device_id go7007_usb_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) USB_DEVICE_ID_MATCH_INT_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) .idProduct = 0x7007, /* Product ID of GO7007SB chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) .bcdDevice_lo = 0x200, /* Revision number of XMen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) .bcdDevice_hi = 0x200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) .bInterfaceClass = 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) .bInterfaceSubClass = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) .bInterfaceProtocol = 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) .idProduct = 0x7007, /* Product ID of GO7007SB chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) .bcdDevice_lo = 0x202, /* Revision number of Matrix II */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) .bcdDevice_hi = 0x202,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_II,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) .idProduct = 0x7007, /* Product ID of GO7007SB chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) .bcdDevice_lo = 0x204, /* Revision number of Matrix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) .bcdDevice_hi = 0x204, /* Reloaded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_RELOAD,
^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) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) USB_DEVICE_ID_MATCH_INT_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) .idProduct = 0x7007, /* Product ID of GO7007SB chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) .bcdDevice_lo = 0x205, /* Revision number of XMen-II */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) .bcdDevice_hi = 0x205,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) .bInterfaceClass = 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) .bInterfaceSubClass = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) .bInterfaceProtocol = 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN_II,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) .idProduct = 0x7007, /* Product ID of GO7007SB chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) .bcdDevice_lo = 0x208, /* Revision number of Star Trek */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) .bcdDevice_hi = 0x208,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) .driver_info = (kernel_ulong_t)GO7007_BOARDID_STAR_TREK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) USB_DEVICE_ID_MATCH_INT_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) .idProduct = 0x7007, /* Product ID of GO7007SB chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) .bcdDevice_lo = 0x209, /* Revision number of XMen-III */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) .bcdDevice_hi = 0x209,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) .bInterfaceClass = 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) .bInterfaceSubClass = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) .bInterfaceProtocol = 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN_III,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) .idProduct = 0x7007, /* Product ID of GO7007SB chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .bcdDevice_lo = 0x210, /* Revision number of Matrix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) .bcdDevice_hi = 0x210, /* Revolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_REV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) .idVendor = 0x093b, /* Vendor ID of Plextor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) .idProduct = 0xa102, /* Product ID of M402U */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) .bcdDevice_lo = 0x1, /* revision number of Blueberry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) .bcdDevice_hi = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) .driver_info = (kernel_ulong_t)GO7007_BOARDID_PX_M402U,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) .idVendor = 0x093b, /* Vendor ID of Plextor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) .idProduct = 0xa104, /* Product ID of TV402U */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) .bcdDevice_lo = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) .bcdDevice_hi = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) .driver_info = (kernel_ulong_t)GO7007_BOARDID_PX_TV402U,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) .idVendor = 0x10fd, /* Vendor ID of Anubis Electronics */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) .idProduct = 0xde00, /* Product ID of Lifeview LR192 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) .bcdDevice_lo = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) .bcdDevice_hi = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) .driver_info = (kernel_ulong_t)GO7007_BOARDID_LIFEVIEW_LR192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) .idVendor = 0x1943, /* Vendor ID Sensoray */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) .idProduct = 0x2250, /* Product ID of 2250/2251 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) .bcdDevice_lo = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) .bcdDevice_hi = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) .driver_info = (kernel_ulong_t)GO7007_BOARDID_SENSORAY_2250,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) .idVendor = 0x06e1, /* Vendor ID of ADS Technologies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .idProduct = 0x0709, /* Product ID of DVD Xpress DX2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) .bcdDevice_lo = 0x204,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) .bcdDevice_hi = 0x204,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .driver_info = (kernel_ulong_t)GO7007_BOARDID_ADS_USBAV_709,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) MODULE_DEVICE_TABLE(usb, go7007_usb_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) /********************* Driver for EZ-USB HPI interface *********************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) static int go7007_usb_vendor_request(struct go7007 *go, int request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) int value, int index, void *transfer_buffer, int length, int in)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) int timeout = 5000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) if (in) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) return usb_control_msg(usb->usbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) usb_rcvctrlpipe(usb->usbdev, 0), request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) value, index, transfer_buffer, length, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) return usb_control_msg(usb->usbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) usb_sndctrlpipe(usb->usbdev, 0), request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) USB_TYPE_VENDOR | USB_RECIP_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) value, index, transfer_buffer, length, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) static int go7007_usb_interface_reset(struct go7007 *go)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) u16 intr_val, intr_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if (go->status == STATUS_SHUTDOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) /* Reset encoder */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if (usb->board->flags & GO7007_USB_EZUSB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) /* Reset buffer in EZ-USB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) pr_debug("resetting EZ-USB buffers\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) if (go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) /* Reset encoder again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) /* Wait for an interrupt to indicate successful hardware reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (go7007_read_interrupt(go, &intr_val, &intr_data) < 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) (intr_val & ~0x1) != 0x55aa) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) dev_err(go->dev, "unable to reset the USB interface\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) static int go7007_usb_ezusb_write_interrupt(struct go7007 *go,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) int addr, int data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) int i, r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) u16 status_reg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) int timeout = 500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) pr_debug("WriteInterrupt: %04x %04x\n", addr, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) for (i = 0; i < 100; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) r = usb_control_msg(usb->usbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) usb_rcvctrlpipe(usb->usbdev, 0), 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 0, HPI_STATUS_ADDR, go->usb_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) sizeof(status_reg), timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) status_reg = le16_to_cpu(*((__le16 *)go->usb_buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) if (!(status_reg & 0x0010))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) goto write_int_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (i == 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) dev_err(go->dev, "device is hung, status reg = 0x%04x\n", status_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0), 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) USB_TYPE_VENDOR | USB_RECIP_DEVICE, data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) INT_PARAM_ADDR, NULL, 0, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) goto write_int_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 0x12, USB_TYPE_VENDOR | USB_RECIP_DEVICE, addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) INT_INDEX_ADDR, NULL, 0, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) goto write_int_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) write_int_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) dev_err(go->dev, "error in WriteInterrupt: %d\n", r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) static int go7007_usb_onboard_write_interrupt(struct go7007 *go,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) int addr, int data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) int timeout = 500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) pr_debug("WriteInterrupt: %04x %04x\n", addr, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) go->usb_buf[0] = data & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) go->usb_buf[1] = data >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) go->usb_buf[2] = addr & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) go->usb_buf[3] = addr >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) go->usb_buf[4] = go->usb_buf[5] = go->usb_buf[6] = go->usb_buf[7] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 2), 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) USB_TYPE_VENDOR | USB_RECIP_ENDPOINT, 0x55aa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 0xf0f0, go->usb_buf, 8, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) if (r < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) dev_err(go->dev, "error in WriteInterrupt: %d\n", r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) static void go7007_usb_readinterrupt_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) struct go7007 *go = (struct go7007 *)urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) __le16 *regs = (__le16 *)urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) int status = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) if (status != -ESHUTDOWN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) go->status != STATUS_SHUTDOWN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) dev_err(go->dev, "error in read interrupt: %d\n", urb->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) wake_up(&go->interrupt_waitq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) } else if (urb->actual_length != urb->transfer_buffer_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) dev_err(go->dev, "short read in interrupt pipe!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) go->interrupt_available = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) go->interrupt_data = __le16_to_cpu(regs[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) go->interrupt_value = __le16_to_cpu(regs[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) pr_debug("ReadInterrupt: %04x %04x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) go->interrupt_value, go->interrupt_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) wake_up(&go->interrupt_waitq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) static int go7007_usb_read_interrupt(struct go7007 *go)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) r = usb_submit_urb(usb->intr_urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) if (r < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) dev_err(go->dev, "unable to submit interrupt urb: %d\n", r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) static void go7007_usb_read_video_pipe_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) struct go7007 *go = (struct go7007 *)urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) int r, status = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) if (!vb2_is_streaming(&go->vidq)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) wake_up_interruptible(&go->frame_waitq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) dev_err(go->dev, "error in video pipe: %d\n", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) if (urb->actual_length != urb->transfer_buffer_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) dev_err(go->dev, "short read in video pipe!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) go7007_parse_video_stream(go, urb->transfer_buffer, urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) r = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) dev_err(go->dev, "error in video pipe: %d\n", r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) static void go7007_usb_read_audio_pipe_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) struct go7007 *go = (struct go7007 *)urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) int r, status = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) if (!vb2_is_streaming(&go->vidq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) dev_err(go->dev, "error in audio pipe: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) if (urb->actual_length != urb->transfer_buffer_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) dev_err(go->dev, "short read in audio pipe!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) if (go->audio_deliver != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) go->audio_deliver(go, urb->transfer_buffer, urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) r = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) dev_err(go->dev, "error in audio pipe: %d\n", r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) static int go7007_usb_stream_start(struct go7007 *go)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) int i, r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) for (i = 0; i < 8; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) r = usb_submit_urb(usb->video_urbs[i], GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) if (r < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) dev_err(go->dev, "error submitting video urb %d: %d\n", i, r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) goto video_submit_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) if (!go->audio_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) for (i = 0; i < 8; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) r = usb_submit_urb(usb->audio_urbs[i], GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (r < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) dev_err(go->dev, "error submitting audio urb %d: %d\n", i, r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) goto audio_submit_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) audio_submit_failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) for (i = 0; i < 7; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) usb_kill_urb(usb->audio_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) video_submit_failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) for (i = 0; i < 8; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) usb_kill_urb(usb->video_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) static int go7007_usb_stream_stop(struct go7007 *go)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) if (go->status == STATUS_SHUTDOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) for (i = 0; i < 8; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) usb_kill_urb(usb->video_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (go->audio_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) for (i = 0; i < 8; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) usb_kill_urb(usb->audio_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) static int go7007_usb_send_firmware(struct go7007 *go, u8 *data, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) int transferred, pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) int timeout = 500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) pr_debug("DownloadBuffer sending %d bytes\n", len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) if (usb->board->flags & GO7007_USB_EZUSB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) pipe = usb_sndbulkpipe(usb->usbdev, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) pipe = usb_sndbulkpipe(usb->usbdev, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return usb_bulk_msg(usb->usbdev, pipe, data, len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) &transferred, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) static void go7007_usb_release(struct go7007 *go)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) struct urb *vurb, *aurb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) if (usb->intr_urb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) usb_kill_urb(usb->intr_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) kfree(usb->intr_urb->transfer_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) usb_free_urb(usb->intr_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) /* Free USB-related structs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) for (i = 0; i < 8; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) vurb = usb->video_urbs[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) if (vurb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) usb_kill_urb(vurb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) kfree(vurb->transfer_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) usb_free_urb(vurb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) aurb = usb->audio_urbs[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (aurb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) usb_kill_urb(aurb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) kfree(aurb->transfer_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) usb_free_urb(aurb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) kfree(go->hpi_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) static const struct go7007_hpi_ops go7007_usb_ezusb_hpi_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) .interface_reset = go7007_usb_interface_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) .write_interrupt = go7007_usb_ezusb_write_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) .read_interrupt = go7007_usb_read_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) .stream_start = go7007_usb_stream_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) .stream_stop = go7007_usb_stream_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) .send_firmware = go7007_usb_send_firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) .release = go7007_usb_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) static const struct go7007_hpi_ops go7007_usb_onboard_hpi_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) .interface_reset = go7007_usb_interface_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) .write_interrupt = go7007_usb_onboard_write_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) .read_interrupt = go7007_usb_read_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) .stream_start = go7007_usb_stream_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) .stream_stop = go7007_usb_stream_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) .send_firmware = go7007_usb_send_firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) .release = go7007_usb_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) /********************* Driver for EZ-USB I2C adapter *********************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) struct i2c_msg msgs[], int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) struct go7007 *go = i2c_get_adapdata(adapter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) struct go7007_usb *usb = go->hpi_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) u8 *buf = go->usb_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) int buf_len, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) int ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (go->status == STATUS_SHUTDOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) mutex_lock(&usb->i2c_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) for (i = 0; i < num; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) /* The hardware command is "write some bytes then read some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) * bytes", so we try to coalesce a write followed by a read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) * into a single USB transaction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) if (i + 1 < num && msgs[i].addr == msgs[i + 1].addr &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) !(msgs[i].flags & I2C_M_RD) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) (msgs[i + 1].flags & I2C_M_RD)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) #ifdef GO7007_I2C_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) pr_debug("i2c write/read %d/%d bytes on %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) msgs[i].len, msgs[i + 1].len, msgs[i].addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) buf[0] = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) buf[1] = msgs[i].len + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) buf[2] = msgs[i].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) memcpy(&buf[3], msgs[i].buf, msgs[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) buf_len = msgs[i].len + 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) buf[buf_len++] = msgs[++i].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) } else if (msgs[i].flags & I2C_M_RD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) #ifdef GO7007_I2C_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) pr_debug("i2c read %d bytes on %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) msgs[i].len, msgs[i].addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) buf[0] = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) buf[1] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) buf[2] = msgs[i].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) buf[3] = msgs[i].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) buf_len = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) #ifdef GO7007_I2C_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) pr_debug("i2c write %d bytes on %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) msgs[i].len, msgs[i].addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) buf[0] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) buf[1] = msgs[i].len + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) buf[2] = msgs[i].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) memcpy(&buf[3], msgs[i].buf, msgs[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) buf_len = msgs[i].len + 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) buf[buf_len++] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) if (go7007_usb_vendor_request(go, 0x24, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) buf, buf_len, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) goto i2c_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (msgs[i].flags & I2C_M_RD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) memset(buf, 0, msgs[i].len + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) if (go7007_usb_vendor_request(go, 0x25, 0, 0, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) msgs[i].len + 1, 1) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) goto i2c_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) memcpy(msgs[i].buf, buf + 1, msgs[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) ret = num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) i2c_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) mutex_unlock(&usb->i2c_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) static u32 go7007_usb_functionality(struct i2c_adapter *adapter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) /* No errors are reported by the hardware, so we don't bother
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) * supporting quick writes to avoid confusing probing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) return (I2C_FUNC_SMBUS_EMUL) & ~I2C_FUNC_SMBUS_QUICK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) static const struct i2c_algorithm go7007_usb_algo = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) .master_xfer = go7007_usb_i2c_master_xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) .functionality = go7007_usb_functionality,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) static struct i2c_adapter go7007_usb_adap_templ = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) .name = "WIS GO7007SB EZ-USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) .algo = &go7007_usb_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) /********************* USB add/remove functions *********************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) static int go7007_usb_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) struct go7007 *go;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) struct go7007_usb *usb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) const struct go7007_usb_board *board;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) struct usb_device *usbdev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) struct usb_host_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) unsigned num_i2c_devs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) int video_pipe, i, v_urb_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) pr_debug("probing new GO7007 USB board\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) switch (id->driver_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) case GO7007_BOARDID_MATRIX_II:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) name = "WIS Matrix II or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) board = &board_matrix_ii;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) case GO7007_BOARDID_MATRIX_RELOAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) name = "WIS Matrix Reloaded or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) board = &board_matrix_reload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) case GO7007_BOARDID_MATRIX_REV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) name = "WIS Matrix Revolution or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) board = &board_matrix_revolution;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) case GO7007_BOARDID_STAR_TREK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) name = "WIS Star Trek or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) board = &board_star_trek;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) case GO7007_BOARDID_XMEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) name = "WIS XMen or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) board = &board_xmen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) case GO7007_BOARDID_XMEN_II:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) name = "WIS XMen II or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) board = &board_xmen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) case GO7007_BOARDID_XMEN_III:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) name = "WIS XMen III or compatible";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) board = &board_xmen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) case GO7007_BOARDID_PX_M402U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) name = "Plextor PX-M402U";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) board = &board_matrix_ii;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) case GO7007_BOARDID_PX_TV402U:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) name = "Plextor PX-TV402U (unknown tuner)";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) board = &board_px_tv402u;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) case GO7007_BOARDID_LIFEVIEW_LR192:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) dev_err(&intf->dev, "The Lifeview TV Walker Ultra is not supported. Sorry!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) name = "Lifeview TV Walker Ultra";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) board = &board_lifeview_lr192;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) case GO7007_BOARDID_SENSORAY_2250:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) dev_info(&intf->dev, "Sensoray 2250 found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) name = "Sensoray 2250/2251";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) board = &board_sensoray_2250;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) case GO7007_BOARDID_ADS_USBAV_709:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) name = "ADS Tech DVD Xpress DX2";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) board = &board_ads_usbav_709;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) dev_err(&intf->dev, "unknown board ID %d!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) (unsigned int)id->driver_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) return -ENODEV;
^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) go = go7007_alloc(&board->main_info, &intf->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) if (go == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) usb = kzalloc(sizeof(struct go7007_usb), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) if (usb == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) kfree(go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) usb->board = board;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) usb->usbdev = usbdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) usb_make_path(usbdev, go->bus_info, sizeof(go->bus_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) go->board_id = id->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) strscpy(go->name, name, sizeof(go->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) if (board->flags & GO7007_USB_EZUSB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) go->hpi_ops = &go7007_usb_ezusb_hpi_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) go->hpi_ops = &go7007_usb_onboard_hpi_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) go->hpi_context = usb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) ep = usb->usbdev->ep_in[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) /* Allocate the URB and buffer for receiving incoming interrupts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) usb->intr_urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) if (usb->intr_urb == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) usb->intr_urb->transfer_buffer = kmalloc_array(2, sizeof(u16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) if (usb->intr_urb->transfer_buffer == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) usb_fill_bulk_urb(usb->intr_urb, usb->usbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) usb_rcvbulkpipe(usb->usbdev, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) usb->intr_urb->transfer_buffer, 2*sizeof(u16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) go7007_usb_readinterrupt_complete, go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) usb_fill_int_urb(usb->intr_urb, usb->usbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) usb_rcvintpipe(usb->usbdev, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) usb->intr_urb->transfer_buffer, 2*sizeof(u16),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) go7007_usb_readinterrupt_complete, go, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) usb_set_intfdata(intf, &go->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) /* Boot the GO7007 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) if (go7007_boot_encoder(go, go->board_info->flags &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) GO7007_BOARD_USE_ONBOARD_I2C) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) /* Register the EZ-USB I2C adapter, if we're using it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) if (board->flags & GO7007_USB_EZUSB_I2C) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) memcpy(&go->i2c_adapter, &go7007_usb_adap_templ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) sizeof(go7007_usb_adap_templ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) mutex_init(&usb->i2c_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) go->i2c_adapter.dev.parent = go->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) i2c_set_adapdata(&go->i2c_adapter, go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) if (i2c_add_adapter(&go->i2c_adapter) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) dev_err(go->dev, "error: i2c_add_adapter failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) go->i2c_adapter_online = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) /* Pelco and Adlink reused the XMen and XMen-III vendor and product
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) * IDs for their own incompatible designs. We can detect XMen boards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) * by probing the sensor, but there is no way to probe the sensors on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) * the Pelco and Adlink designs so we default to the Adlink. If it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) * is actually a Pelco, the user must set the assume_endura module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) * parameter. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) if ((go->board_id == GO7007_BOARDID_XMEN ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) go->board_id == GO7007_BOARDID_XMEN_III) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) go->i2c_adapter_online) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) union i2c_smbus_data data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) /* Check to see if register 0x0A is 0x76 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) i2c_smbus_xfer(&go->i2c_adapter, 0x21, I2C_CLIENT_SCCB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) I2C_SMBUS_READ, 0x0A, I2C_SMBUS_BYTE_DATA, &data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) if (data.byte != 0x76) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) if (assume_endura) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) go->board_id = GO7007_BOARDID_ENDURA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) usb->board = board = &board_endura;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) go->board_info = &board->main_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) strscpy(go->name, "Pelco Endura",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) sizeof(go->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) u16 channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) /* read channel number from GPIO[1:0] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) go7007_read_addr(go, 0x3c81, &channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) channel &= 0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) go->board_id = GO7007_BOARDID_ADLINK_MPG24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) usb->board = board = &board_adlink_mpg24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) go->board_info = &board->main_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) go->channel_number = channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) snprintf(go->name, sizeof(go->name),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) "Adlink PCI-MPG24, channel #%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) go7007_update_board(go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) num_i2c_devs = go->board_info->num_i2c_devs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) /* Probe the tuner model on the TV402U */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) if (go->board_id == GO7007_BOARDID_PX_TV402U) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) /* Board strapping indicates tuner model */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) if (go7007_usb_vendor_request(go, 0x41, 0, 0, go->usb_buf, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) dev_err(go->dev, "GPIO read failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) switch (go->usb_buf[0] >> 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) go->tuner_type = TUNER_SONY_BTF_PG472Z;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) go->std = V4L2_STD_PAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) strscpy(go->name, "Plextor PX-TV402U-EU",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) sizeof(go->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) go->tuner_type = TUNER_SONY_BTF_PK467Z;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) go->std = V4L2_STD_NTSC_M_JP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) num_i2c_devs -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) strscpy(go->name, "Plextor PX-TV402U-JP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) sizeof(go->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) go->tuner_type = TUNER_SONY_BTF_PB463Z;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) num_i2c_devs -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) strscpy(go->name, "Plextor PX-TV402U-NA",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) sizeof(go->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) pr_debug("unable to detect tuner type!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) /* Configure tuner mode selection inputs connected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) * to the EZ-USB GPIO output pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) if (go7007_usb_vendor_request(go, 0x40, 0x7f02, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) NULL, 0, 0) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) dev_err(go->dev, "GPIO write failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) /* Print a nasty message if the user attempts to use a USB2.0 device in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) * a USB1.1 port. There will be silent corruption of the stream. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) if ((board->flags & GO7007_USB_EZUSB) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) usbdev->speed != USB_SPEED_HIGH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) dev_err(go->dev, "*** WARNING *** This device must be connected to a USB 2.0 port! Attempting to capture video through a USB 1.1 port will result in stream corruption, even at low bitrates!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) /* Allocate the URBs and buffers for receiving the video stream */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) if (board->flags & GO7007_USB_EZUSB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) if (!usb->usbdev->ep_in[6])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) v_urb_len = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) video_pipe = usb_rcvbulkpipe(usb->usbdev, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) if (!usb->usbdev->ep_in[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) v_urb_len = 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) video_pipe = usb_rcvbulkpipe(usb->usbdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) for (i = 0; i < 8; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) usb->video_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) if (usb->video_urbs[i] == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) usb->video_urbs[i]->transfer_buffer =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) kmalloc(v_urb_len, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) if (usb->video_urbs[i]->transfer_buffer == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) usb_fill_bulk_urb(usb->video_urbs[i], usb->usbdev, video_pipe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) usb->video_urbs[i]->transfer_buffer, v_urb_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) go7007_usb_read_video_pipe_complete, go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) /* Allocate the URBs and buffers for receiving the audio stream */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) if ((board->flags & GO7007_USB_EZUSB) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) (board->main_info.flags & GO7007_BOARD_HAS_AUDIO)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) if (!usb->usbdev->ep_in[8])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) for (i = 0; i < 8; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) usb->audio_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) if (usb->audio_urbs[i] == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) usb->audio_urbs[i]->transfer_buffer = kmalloc(4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) if (usb->audio_urbs[i]->transfer_buffer == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) usb_fill_bulk_urb(usb->audio_urbs[i], usb->usbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) usb_rcvbulkpipe(usb->usbdev, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) usb->audio_urbs[i]->transfer_buffer, 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) go7007_usb_read_audio_pipe_complete, go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) /* Do any final GO7007 initialization, then register the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) * V4L2 and ALSA interfaces */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) if (go7007_register_encoder(go, num_i2c_devs) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) goto allocfail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) go->status = STATUS_ONLINE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) allocfail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) go7007_usb_release(go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) kfree(go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) static void go7007_usb_disconnect(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) struct go7007 *go = to_go7007(usb_get_intfdata(intf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) mutex_lock(&go->queue_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) mutex_lock(&go->serialize_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) if (go->audio_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) go7007_snd_remove(go);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) go->status = STATUS_SHUTDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) v4l2_device_disconnect(&go->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) video_unregister_device(&go->vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) mutex_unlock(&go->serialize_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) mutex_unlock(&go->queue_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) v4l2_device_put(&go->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) static struct usb_driver go7007_usb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) .name = "go7007",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) .probe = go7007_usb_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) .disconnect = go7007_usb_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) .id_table = go7007_usb_id_table,
^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) module_usb_driver(go7007_usb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) MODULE_LICENSE("GPL v2");