^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) /* DVB USB compliant linux driver for Conexant USB reference design.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * The Conexant reference design I saw on their website was only for analogue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * capturing (using the cx25842). The box I took to write this driver (reverse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * engineered) is the one labeled Medion MD95700. In addition to the cx25842
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * for analogue capturing it also has a cx22702 DVB-T demodulator on the main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * board. Besides it has a atiremote (X10) and a USB2.0 hub onboard.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Maybe it is a little bit premature to call this driver cxusb, but I assume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * the USB protocol is identical or at least inherited from the reference
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * design, so it can be reused for the "analogue-only" device (if it will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * appear at all).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Copyright (C) 2005 Patrick Boettcher (patrick.boettcher@posteo.de)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Copyright (C) 2006 Michael Krufky (mkrufky@linuxtv.org)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Copyright (C) 2006, 2007 Chris Pascoe (c.pascoe@itee.uq.edu.au)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * Copyright (C) 2011, 2017 Maciej S. Szmigiero (mail@maciej.szmigiero.name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <media/tuner.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include "cxusb.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "cx22702.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "lgdt330x.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "mt352.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "mt352_priv.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "zl10353.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "tuner-xc2028.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "tuner-simple.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "mxl5005s.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "max2165.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "dib7000p.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include "dib0070.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include "lgs8gxx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include "atbm8830.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include "si2168.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include "si2157.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* debug */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int dvb_usb_cxusb_debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) module_param_named(debug, dvb_usb_cxusb_debug, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) MODULE_PARM_DESC(debug, "set debugging level (see cxusb.h)."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) DVB_USB_DEBUG_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) enum cxusb_table_index {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) MEDION_MD95700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) DVICO_BLUEBIRD_LG064F_COLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) DVICO_BLUEBIRD_LG064F_WARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) DVICO_BLUEBIRD_DUAL_1_COLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) DVICO_BLUEBIRD_DUAL_1_WARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) DVICO_BLUEBIRD_LGZ201_COLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) DVICO_BLUEBIRD_LGZ201_WARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) DVICO_BLUEBIRD_TH7579_COLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) DVICO_BLUEBIRD_TH7579_WARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) DIGITALNOW_BLUEBIRD_DUAL_1_COLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) DIGITALNOW_BLUEBIRD_DUAL_1_WARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) DVICO_BLUEBIRD_DUAL_2_COLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) DVICO_BLUEBIRD_DUAL_2_WARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) DVICO_BLUEBIRD_DUAL_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) DVICO_BLUEBIRD_DVB_T_NANO_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) AVERMEDIA_VOLAR_A868R,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) DVICO_BLUEBIRD_DUAL_4_REV_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) CONEXANT_D680_DMB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) MYGICA_D689,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) NR__cxusb_table_index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static struct usb_device_id cxusb_table[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) int cxusb_ctrl_msg(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u8 cmd, const u8 *wbuf, int wlen, u8 *rbuf, int rlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct cxusb_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (1 + wlen > MAX_XFER_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) warn("i2c wr: len=%d is too big!\n", wlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (rlen > MAX_XFER_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) warn("i2c rd: len=%d is too big!\n", rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) mutex_lock(&d->data_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) st->data[0] = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) memcpy(&st->data[1], wbuf, wlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) ret = dvb_usb_generic_rw(d, st->data, 1 + wlen, st->data, rlen, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) if (!ret && rbuf && rlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) memcpy(rbuf, st->data, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) mutex_unlock(&d->data_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /* GPIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct cxusb_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) u8 o[2], i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) if (st->gpio_write_state[GPIO_TUNER] == onoff &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) !st->gpio_write_refresh[GPIO_TUNER])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) o[0] = GPIO_TUNER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) o[1] = onoff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) if (i != 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) dev_info(&d->udev->dev, "gpio_write failed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) st->gpio_write_state[GPIO_TUNER] = onoff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) st->gpio_write_refresh[GPIO_TUNER] = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static int cxusb_bluebird_gpio_rw(struct dvb_usb_device *d, u8 changemask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u8 newval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u8 o[2], gpio_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) o[0] = 0xff & ~changemask; /* mask of bits to keep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) o[1] = newval & changemask; /* new values for bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) rc = cxusb_ctrl_msg(d, CMD_BLUEBIRD_GPIO_RW, o, 2, &gpio_state, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (rc < 0 || (gpio_state & changemask) != (newval & changemask))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) dev_info(&d->udev->dev, "bluebird_gpio_write failed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) return rc < 0 ? rc : gpio_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) static void cxusb_bluebird_gpio_pulse(struct dvb_usb_device *d, u8 pin, int low)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) cxusb_bluebird_gpio_rw(d, pin, low ? 0 : pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) msleep(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) cxusb_bluebird_gpio_rw(d, pin, low ? pin : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static void cxusb_nano2_led(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) cxusb_bluebird_gpio_rw(d, 0x40, onoff ? 0 : 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static int cxusb_d680_dmb_gpio_tuner(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) u8 addr, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) u8 o[2] = {addr, onoff};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) u8 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) rc = cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (i == 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) dev_info(&d->udev->dev, "gpio_write failed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct dvb_usb_device *d = i2c_get_adapdata(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) for (i = 0; i < num; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_MEDION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) switch (msg[i].addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) case 0x63:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) cxusb_gpio_tuner(d, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) cxusb_gpio_tuner(d, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (msg[i].flags & I2C_M_RD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) /* read only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) u8 obuf[3], ibuf[MAX_XFER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (1 + msg[i].len > sizeof(ibuf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) warn("i2c rd: len=%d is too big!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) obuf[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) obuf[1] = msg[i].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) obuf[2] = msg[i].addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (cxusb_ctrl_msg(d, CMD_I2C_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) obuf, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) ibuf, 1 + msg[i].len) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) warn("i2c read failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) memcpy(msg[i].buf, &ibuf[1], msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) } else if (i + 1 < num && (msg[i + 1].flags & I2C_M_RD) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) msg[i].addr == msg[i + 1].addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /* write to then read from same address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) u8 obuf[MAX_XFER_SIZE], ibuf[MAX_XFER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) if (3 + msg[i].len > sizeof(obuf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) warn("i2c wr: len=%d is too big!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (1 + msg[i + 1].len > sizeof(ibuf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) warn("i2c rd: len=%d is too big!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) msg[i + 1].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) obuf[0] = msg[i].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) obuf[1] = msg[i + 1].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) obuf[2] = msg[i].addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) memcpy(&obuf[3], msg[i].buf, msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (cxusb_ctrl_msg(d, CMD_I2C_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) obuf, 3 + msg[i].len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) ibuf, 1 + msg[i + 1].len) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (ibuf[0] != 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) dev_info(&d->udev->dev, "i2c read may have failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) memcpy(msg[i + 1].buf, &ibuf[1], msg[i + 1].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* write only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) u8 obuf[MAX_XFER_SIZE], ibuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (2 + msg[i].len > sizeof(obuf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) warn("i2c wr: len=%d is too big!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) obuf[0] = msg[i].addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) obuf[1] = msg[i].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) memcpy(&obuf[2], msg[i].buf, msg[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (cxusb_ctrl_msg(d, CMD_I2C_WRITE, obuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 2 + msg[i].len, &ibuf, 1) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (ibuf != 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) dev_info(&d->udev->dev, "i2c write may have failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (i == num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) ret = num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) ret = -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static u32 cxusb_i2c_func(struct i2c_adapter *adapter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static struct i2c_algorithm cxusb_i2c_algo = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) .master_xfer = cxusb_i2c_xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .functionality = cxusb_i2c_func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static int _cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) u8 b = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) dev_info(&d->udev->dev, "setting power %s\n", onoff ? "ON" : "OFF");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) bool is_medion = d->props.devices[0].warm_ids[0] == &cxusb_table[MEDION_MD95700];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (is_medion && !onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) struct cxusb_medion_dev *cxdev = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) mutex_lock(&cxdev->open_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (cxdev->open_type == CXUSB_OPEN_ANALOG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) dev_info(&d->udev->dev, "preventing DVB core from setting power OFF while we are in analog mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) ret = _cxusb_power_ctrl(d, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) ret_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) if (is_medion && !onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) struct cxusb_medion_dev *cxdev = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) mutex_unlock(&cxdev->open_lock);
^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) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) static int cxusb_aver_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (!onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) return cxusb_ctrl_msg(d, CMD_POWER_OFF, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) if (d->state == DVB_USB_STATE_INIT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) usb_set_interface(d->udev, 0, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* Nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) } while (!(ret = cxusb_ctrl_msg(d, CMD_POWER_ON, NULL, 0, NULL, 0)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) !(ret = cxusb_ctrl_msg(d, 0x15, NULL, 0, NULL, 0)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) !(ret = cxusb_ctrl_msg(d, 0x17, NULL, 0, NULL, 0)) && 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) * FIXME: We don't know why, but we need to configure the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) * lgdt3303 with the register settings below on resume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) u8 buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) static const u8 bufs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 0x0e, 0x2, 0x00, 0x7f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 0x0e, 0x2, 0x02, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 0x0e, 0x2, 0x02, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 0x0e, 0x2, 0x00, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 0x0e, 0x2, 0x0d, 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 0x0e, 0x2, 0x0e, 0x87,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 0x0e, 0x2, 0x0f, 0x8e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 0x0e, 0x2, 0x10, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 0x0e, 0x2, 0x14, 0xd7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 0x0e, 0x2, 0x47, 0x88,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) for (i = 0; i < ARRAY_SIZE(bufs); i += 4 / sizeof(u8)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) ret = cxusb_ctrl_msg(d, CMD_I2C_WRITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) bufs + i, 4, &buf, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (buf != 0x8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) return ret;
^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) static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) u8 b = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) static int cxusb_nano2_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) rc = cxusb_power_ctrl(d, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (!onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) cxusb_nano2_led(d, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) static int cxusb_d680_dmb_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) u8 b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) ret = cxusb_power_ctrl(d, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) if (!onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) msleep(128);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) cxusb_ctrl_msg(d, CMD_DIGITAL, NULL, 0, &b, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) static int cxusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) struct dvb_usb_device *dvbdev = adap->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) bool is_medion = dvbdev->props.devices[0].warm_ids[0] ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) &cxusb_table[MEDION_MD95700];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) u8 buf[2] = { 0x03, 0x00 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) if (is_medion && onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) ret = cxusb_medion_get(dvbdev, CXUSB_OPEN_DIGITAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) cxusb_ctrl_msg(dvbdev, CMD_STREAMING_ON, buf, 2, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) cxusb_ctrl_msg(dvbdev, CMD_STREAMING_OFF, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if (is_medion && !onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) cxusb_medion_put(dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) static int cxusb_aver_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_ON, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) int ep = d->props.generic_bulk_ctrl_endpoint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) const int timeout = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) const int junk_len = 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) u8 *junk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) int rd_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) /* Discard remaining data in video pipe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) junk = kmalloc(junk_len, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) if (!junk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) if (usb_bulk_msg(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) usb_rcvbulkpipe(d->udev, ep),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) junk, junk_len, &rd_count, timeout) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) if (!rd_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) kfree(junk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) struct usb_data_stream_properties *p = &d->props.adapter[0].fe[0].stream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) const int timeout = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) const int junk_len = p->u.bulk.buffersize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) u8 *junk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) int rd_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) /* Discard remaining data in video pipe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) junk = kmalloc(junk_len, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) if (!junk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) if (usb_bulk_msg(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) usb_rcvbulkpipe(d->udev, p->endpoint),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) junk, junk_len, &rd_count, timeout) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (!rd_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) kfree(junk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static int cxusb_d680_dmb_streaming_ctrl(struct dvb_usb_adapter *adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) u8 buf[2] = { 0x03, 0x00 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) cxusb_d680_dmb_drain_video(adap->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) buf, sizeof(buf), NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) int ret = cxusb_ctrl_msg(adap->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) CMD_STREAMING_OFF, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) static int cxusb_rc_query(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) u8 ircode[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) if (cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) if (ircode[2] || ircode[3])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) rc_keydown(d->rc_dev, RC_PROTO_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) RC_SCANCODE_NEC(~ircode[2] & 0xff, ircode[3]), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) u8 ircode[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) struct i2c_msg msg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) .addr = 0x6b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) .flags = I2C_M_RD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) .buf = ircode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) .len = 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) if (cxusb_i2c_xfer(&d->i2c_adap, &msg, 1) != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) if (ircode[1] || ircode[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) rc_keydown(d->rc_dev, RC_PROTO_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) RC_SCANCODE_NEC(~ircode[1] & 0xff, ircode[2]), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) u8 ircode[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (cxusb_ctrl_msg(d, 0x10, NULL, 0, ircode, 2) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) if (ircode[0] || ircode[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) rc_keydown(d->rc_dev, RC_PROTO_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) RC_SCANCODE_RC5(ircode[0], ircode[1]), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) static int cxusb_dee1601_demod_init(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) static u8 reset[] = { RESET, 0x80 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) mt352_write(fe, clock_config, sizeof(clock_config));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) udelay(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) mt352_write(fe, reset, sizeof(reset));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) mt352_write(fe, agc_cfg, sizeof(agc_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) static int cxusb_mt352_demod_init(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) /* used in both lgz201 and th7579 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x29 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) static u8 reset[] = { RESET, 0x80 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) static u8 agc_cfg[] = { AGC_TARGET, 0x24, 0x20 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) mt352_write(fe, clock_config, sizeof(clock_config));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) udelay(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) mt352_write(fe, reset, sizeof(reset));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) mt352_write(fe, agc_cfg, sizeof(agc_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) static struct cx22702_config cxusb_cx22702_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) .demod_address = 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) .output_mode = CX22702_PARALLEL_OUTPUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) static struct lgdt330x_config cxusb_lgdt3303_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .demod_chip = LGDT3303,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) static struct lgdt330x_config cxusb_aver_lgdt3303_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .demod_chip = LGDT3303,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) .clock_polarity_flip = 2,
^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) static struct mt352_config cxusb_dee1601_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) .demod_address = 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) .demod_init = cxusb_dee1601_demod_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) static struct zl10353_config cxusb_zl10353_dee1601_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) .demod_address = 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) .parallel_ts = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) static struct mt352_config cxusb_mt352_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) /* used in both lgz201 and th7579 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) .demod_address = 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) .demod_init = cxusb_mt352_demod_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) static struct zl10353_config cxusb_zl10353_xc3028_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) .demod_address = 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) .if2 = 45600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) .no_tuner = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) .parallel_ts = 1,
^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 struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) .demod_address = 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) .if2 = 45600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) .no_tuner = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) .parallel_ts = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) .disable_i2c_gate_ctrl = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) static struct mt352_config cxusb_mt352_xc3028_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) .demod_address = 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) .if2 = 4560,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) .no_tuner = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) .demod_init = cxusb_mt352_demod_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) /* FIXME: needs tweaking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) static struct mxl5005s_config aver_a868r_tuner = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) .i2c_address = 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) .if_freq = 6000000UL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) .xtal_freq = CRYSTAL_FREQ_16000000HZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) .agc_mode = MXL_SINGLE_AGC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) .tracking_filter = MXL_TF_C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) .rssi_enable = MXL_RSSI_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) .cap_select = MXL_CAP_SEL_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) .div_out = MXL_DIV_OUT_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) .clock_out = MXL_CLOCK_OUT_DISABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) .top = MXL5005S_TOP_25P2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) .mod_mode = MXL_DIGITAL_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) .if_mode = MXL_ZERO_IF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) .AgcMasterByte = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) /* FIXME: needs tweaking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) static struct mxl5005s_config d680_dmb_tuner = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) .i2c_address = 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) .if_freq = 36125000UL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) .xtal_freq = CRYSTAL_FREQ_16000000HZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) .agc_mode = MXL_SINGLE_AGC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) .tracking_filter = MXL_TF_C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) .rssi_enable = MXL_RSSI_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) .cap_select = MXL_CAP_SEL_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) .div_out = MXL_DIV_OUT_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) .clock_out = MXL_CLOCK_OUT_DISABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) .top = MXL5005S_TOP_25P2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) .mod_mode = MXL_DIGITAL_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) .if_mode = MXL_ZERO_IF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) .AgcMasterByte = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) static struct max2165_config mygica_d689_max2165_cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) .i2c_address = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) .osc_clk = 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) /* Callbacks for DVB USB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) struct dvb_usb_device *dvbdev = adap->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) bool is_medion = dvbdev->props.devices[0].warm_ids[0] ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) &cxusb_table[MEDION_MD95700];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) &dvbdev->i2c_adap, 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) TUNER_PHILIPS_FMD1216ME_MK3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (is_medion && adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) * make sure that DVB core won't put to sleep (reset, really)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) * tuner when we might be open in analog mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) adap->fe_adap[0].fe->ops.tuner_ops.sleep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) NULL, DVB_PLL_THOMSON_DTT7579);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) NULL, DVB_PLL_LG_Z201);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) NULL, DVB_PLL_THOMSON_DTT7579);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) static int dvico_bluebird_xc2028_callback(void *ptr, int component,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) int command, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) struct dvb_usb_adapter *adap = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) struct dvb_usb_device *d = adap->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) switch (command) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) case XC2028_TUNER_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) dev_info(&d->udev->dev, "XC2028_TUNER_RESET %d\n", arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) cxusb_bluebird_gpio_pulse(d, 0x01, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) case XC2028_RESET_CLK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) dev_info(&d->udev->dev, "XC2028_RESET_CLK %d\n", arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) case XC2028_I2C_FLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) dev_info(&d->udev->dev, "unknown command %d, arg %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) command, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct xc2028_config cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) .i2c_adap = &adap->dev->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) .i2c_addr = 0x61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) static struct xc2028_ctrl ctl = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) .fname = XC2028_DEFAULT_FIRMWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) .max_len = 64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) .demod = XC3028_FE_ZARLINK456,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) /* FIXME: generalize & move to common area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) adap->fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) fe = dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) if (!fe || !fe->ops.tuner_ops.set_config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) fe->ops.tuner_ops.set_config(fe, &ctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) &adap->dev->i2c_adap, &aver_a868r_tuner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) fe = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) &adap->dev->i2c_adap, &d680_dmb_tuner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) return (!fe) ? -EIO : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) fe = dvb_attach(max2165_attach, adap->fe_adap[0].fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) return (!fe) ? -EIO : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) static int cxusb_medion_fe_ts_bus_ctrl(struct dvb_frontend *fe, int acquire)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) struct dvb_usb_adapter *adap = fe->dvb->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct dvb_usb_device *dvbdev = adap->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) if (acquire)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) return cxusb_medion_get(dvbdev, CXUSB_OPEN_DIGITAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) cxusb_medion_put(dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) static int cxusb_medion_set_mode(struct dvb_usb_device *dvbdev, bool digital)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) struct cxusb_state *st = dvbdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) u8 b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) * switching mode while doing an I2C transaction often causes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) * the device to crash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) mutex_lock(&dvbdev->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (digital) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) ret = usb_set_interface(dvbdev->udev, 0, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) dev_err(&dvbdev->udev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) "digital interface selection failed (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) ret = usb_set_interface(dvbdev->udev, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) dev_err(&dvbdev->udev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) "analog interface selection failed (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) goto ret_unlock;
^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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) /* pipes need to be cleared after setting interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) ret = usb_clear_halt(dvbdev->udev, usb_rcvbulkpipe(dvbdev->udev, 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) dev_warn(&dvbdev->udev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) "clear halt on IN pipe failed (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) ret = usb_clear_halt(dvbdev->udev, usb_sndbulkpipe(dvbdev->udev, 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) dev_warn(&dvbdev->udev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) "clear halt on OUT pipe failed (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) ret = cxusb_ctrl_msg(dvbdev, digital ? CMD_DIGITAL : CMD_ANALOG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) NULL, 0, &b, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) dev_err(&dvbdev->udev->dev, "mode switch failed (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) /* mode switch seems to reset GPIO states */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) for (i = 0; i < ARRAY_SIZE(st->gpio_write_refresh); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) st->gpio_write_refresh[i] = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) ret_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) mutex_unlock(&dvbdev->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) return ret;
^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 int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct dvb_usb_device *dvbdev = adap->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) bool is_medion = dvbdev->props.devices[0].warm_ids[0] ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) &cxusb_table[MEDION_MD95700];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) if (is_medion) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) ret = cxusb_medion_set_mode(dvbdev, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) adap->fe_adap[0].fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) &dvbdev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) if (!adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (is_medion)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) adap->fe_adap[0].fe->ops.ts_bus_ctrl =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) cxusb_medion_fe_ts_bus_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (usb_set_interface(adap->dev->udev, 0, 7) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) &cxusb_lgdt3303_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) if (adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) &cxusb_aver_lgdt3303_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) if (adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) /* used in both lgz201 and th7579 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) if (adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) if (adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) &cxusb_zl10353_dee1601_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) if (adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) u8 ircode[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) struct i2c_msg msg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) .addr = 0x6b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) .flags = I2C_M_RD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) .buf = ircode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) .len = 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) /* reset the tuner and demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) adap->fe_adap[0].fe =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) dvb_attach(zl10353_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) &cxusb_zl10353_xc3028_config_no_i2c_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) if (!adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) /* try to determine if there is no IR decoder on the I2C bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) for (i = 0; adap->dev->props.rc.core.rc_codes && i < 5; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) if (cxusb_i2c_xfer(&adap->dev->i2c_adap, &msg, 1) != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) goto no_IR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (ircode[0] == 0 && ircode[1] == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) if (ircode[2] + ircode[3] != 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) no_IR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) adap->dev->props.rc.core.rc_codes = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) info("No IR receiver detected on this device.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) static struct dibx000_agc_config dib7070_agc_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
^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) * P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) .inv_gain = 600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) .time_stabiliz = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) .alpha_level = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) .thlock = 118,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) .wbd_inv = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) .wbd_ref = 3530,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) .wbd_sel = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) .wbd_alpha = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) .agc1_max = 65535,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) .agc1_min = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) .agc2_max = 65535,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) .agc2_min = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) .agc1_pt1 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) .agc1_pt2 = 40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) .agc1_pt3 = 183,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) .agc1_slope1 = 206,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) .agc1_slope2 = 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) .agc2_pt1 = 72,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) .agc2_pt2 = 152,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) .agc2_slope1 = 88,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) .agc2_slope2 = 90,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) .alpha_mant = 17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) .alpha_exp = 27,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) .beta_mant = 23,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) .beta_exp = 51,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) .perform_agc_softsplit = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) .internal = 60000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) .sampling = 15000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) .pll_prediv = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) .pll_ratio = 20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) .pll_range = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) .pll_reset = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) .pll_bypass = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) .enable_refdiv = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) .bypclk_div = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) .IO_CLK_en_core = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) .ADClkSrc = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) .modulo = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) /* refsel, sel, freq_15k */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) .ifreq = (0 << 25) | 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) .timf = 20452225,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) .xtal_hz = 12000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) static struct dib7000p_config cxusb_dualdig4_rev2_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) .output_mpeg2_in_188_bytes = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) .agc_config_count = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) .agc = &dib7070_agc_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) .bw = &dib7070_bw_config_12_mhz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) .tuner_is_baseband = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) .spur_protect = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) .gpio_dir = 0xfcef,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) .gpio_val = 0x0110,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) .hostbus_diversity = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) struct dib0700_adapter_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) int (*set_param_save)(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) struct dib7000p_ops dib7000p_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) struct dib0700_adapter_state *state = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) &cxusb_dualdig4_rev2_config) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) pr_warn("Unable to enumerate dib7000p\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) &cxusb_dualdig4_rev2_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) if (!adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) struct dvb_usb_adapter *adap = fe->dvb->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) struct dib0700_adapter_state *state = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) return state->dib7000p_ops.set_gpio(fe, 8, 0, !onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) static struct dib0070_config dib7070p_dib0070_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) .reset = dib7070_tuner_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) .sleep = dib7070_tuner_sleep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) .clock_khz = 12000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) static int dib7070_set_param_override(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) struct dvb_usb_adapter *adap = fe->dvb->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) struct dib0700_adapter_state *state = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) u16 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) u8 band = BAND_OF_FREQUENCY(p->frequency / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) switch (band) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) case BAND_VHF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) offset = 950;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) case BAND_UHF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) offset = 550;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) return state->set_param_save(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) static int cxusb_dualdig4_rev2_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) struct dib0700_adapter_state *st = adap->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) struct i2c_adapter *tun_i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) * No need to call dvb7000p_attach here, as it was called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) * already, as frontend_attach method is called first, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) * tuner_attach is only called on success.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) DIBX000_I2C_INTERFACE_TUNER, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) &dib7070p_dib0070_config) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) /* reset the tuner and demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) &cxusb_zl10353_xc3028_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) if (adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) adap->fe_adap[0].fe = dvb_attach(mt352_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) &cxusb_mt352_xc3028_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) &adap->dev->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) if (adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) static struct lgs8gxx_config d680_lgs8gl5_cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) .prod = LGS8GXX_PROD_LGS8GL5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) .demod_address = 0x19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) .serial_ts = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) .ts_clk_pol = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) .ts_clk_gated = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) .if_clk_freq = 30400, /* 30.4 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) .if_freq = 5725, /* 5.725 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) .if_neg_center = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) .ext_adc = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) .adc_signed = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) .if_neg_edge = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) struct dvb_usb_device *d = adap->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) /* Select required USB configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) if (usb_set_interface(d->udev, 0, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) /* Unblock all USB pipes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) usb_clear_halt(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) usb_sndbulkpipe(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) d->props.generic_bulk_ctrl_endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) usb_clear_halt(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) usb_rcvbulkpipe(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) d->props.generic_bulk_ctrl_endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) usb_clear_halt(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) usb_rcvbulkpipe(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) d->props.adapter[0].fe[0].stream.endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) /* Drain USB pipes to avoid hang after reboot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) for (n = 0; n < 5; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) cxusb_d680_dmb_drain_message(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) cxusb_d680_dmb_drain_video(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) /* Reset the tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) err("clear tuner gpio failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) err("set tuner gpio failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) /* Attach frontend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) &d680_lgs8gl5_cfg, &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) if (!adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) static struct atbm8830_config mygica_d689_atbm8830_cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) .prod = ATBM8830_PROD_8830,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) .demod_address = 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) .serial_ts = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) .ts_sampling_edge = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) .ts_clk_gated = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) .osc_clk_freq = 30400, /* in kHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) .if_freq = 0, /* zero IF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) .zif_swap_iq = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) .agc_min = 0x2E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) .agc_max = 0x90,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) .agc_hold_loop = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) struct dvb_usb_device *d = adap->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) /* Select required USB configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) if (usb_set_interface(d->udev, 0, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) err("set interface failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) /* Unblock all USB pipes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) usb_clear_halt(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) usb_sndbulkpipe(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) d->props.generic_bulk_ctrl_endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) usb_clear_halt(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) usb_rcvbulkpipe(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) d->props.generic_bulk_ctrl_endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) usb_clear_halt(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) usb_rcvbulkpipe(d->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) d->props.adapter[0].fe[0].stream.endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) /* Reset the tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) err("clear tuner gpio failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) err("set tuner gpio failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) /* Attach frontend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) adap->fe_adap[0].fe = dvb_attach(atbm8830_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) &mygica_d689_atbm8830_cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) if (!adap->fe_adap[0].fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) * DViCO has shipped two devices with the same USB ID, but only one of them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) * needs a firmware download. Check the device class details to see if they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) * have non-default values to decide whether the device is actually cold or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) * not, and forget a match if it turns out we selected the wrong device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) static int bluebird_fx2_identify_state(struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) const struct dvb_usb_device_properties *props,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) const struct dvb_usb_device_description **desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) int *cold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) int wascold = *cold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) *cold = udev->descriptor.bDeviceClass == 0xff &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) udev->descriptor.bDeviceSubClass == 0xff &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) udev->descriptor.bDeviceProtocol == 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) if (*cold && !wascold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) *desc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) * DViCO bluebird firmware needs the "warm" product ID to be patched into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * firmware file before download.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) static const int dvico_firmware_id_offsets[] = { 6638, 3204 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) int pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) for (pos = 0; pos < ARRAY_SIZE(dvico_firmware_id_offsets); pos++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) int idoff = dvico_firmware_id_offsets[pos];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) if (fw->size < idoff + 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) if (fw->data[idoff] == (USB_VID_DVICO & 0xff) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) fw->data[idoff + 1] == USB_VID_DVICO >> 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) struct firmware new_fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) u8 *new_fw_data = vmalloc(fw->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) if (!new_fw_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) memcpy(new_fw_data, fw->data, fw->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) new_fw.size = fw->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) new_fw.data = new_fw_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) new_fw_data[idoff + 2] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) le16_to_cpu(udev->descriptor.idProduct) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) new_fw_data[idoff + 3] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) le16_to_cpu(udev->descriptor.idProduct) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) ret = usb_cypress_load_firmware(udev, &new_fw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) CYPRESS_FX2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) vfree(new_fw_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) int cxusb_medion_get(struct dvb_usb_device *dvbdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) enum cxusb_open_type open_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) struct cxusb_medion_dev *cxdev = dvbdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) mutex_lock(&cxdev->open_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) if (WARN_ON((cxdev->open_type == CXUSB_OPEN_INIT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) cxdev->open_type == CXUSB_OPEN_NONE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) cxdev->open_ctr != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (cxdev->open_type == CXUSB_OPEN_INIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) ret = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) if (cxdev->open_ctr == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) if (cxdev->open_type != open_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) dev_info(&dvbdev->udev->dev, "will acquire and switch to %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) open_type == CXUSB_OPEN_ANALOG ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) "analog" : "digital");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) if (open_type == CXUSB_OPEN_ANALOG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) ret = _cxusb_power_ctrl(dvbdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) dev_warn(&dvbdev->udev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) "powerup for analog switch failed (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) ret = cxusb_medion_set_mode(dvbdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) ret = cxusb_medion_analog_init(dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) } else { /* digital */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) ret = _cxusb_power_ctrl(dvbdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) dev_warn(&dvbdev->udev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) "powerup for digital switch failed (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) ret = cxusb_medion_set_mode(dvbdev, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) goto ret_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) cxdev->open_type = open_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) dev_info(&dvbdev->udev->dev, "reacquired idle %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) open_type == CXUSB_OPEN_ANALOG ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) "analog" : "digital");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) cxdev->open_ctr = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) } else if (cxdev->open_type == open_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) cxdev->open_ctr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) dev_info(&dvbdev->udev->dev, "acquired %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) open_type == CXUSB_OPEN_ANALOG ? "analog" : "digital");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) ret_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) mutex_unlock(&cxdev->open_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) void cxusb_medion_put(struct dvb_usb_device *dvbdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) struct cxusb_medion_dev *cxdev = dvbdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) mutex_lock(&cxdev->open_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) if (cxdev->open_type == CXUSB_OPEN_INIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) WARN_ON(cxdev->open_ctr != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) cxdev->open_type = CXUSB_OPEN_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) if (!WARN_ON(cxdev->open_ctr < 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) cxdev->open_ctr--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) dev_info(&dvbdev->udev->dev, "release %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) cxdev->open_type == CXUSB_OPEN_ANALOG ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) "analog" : "digital");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) mutex_unlock(&cxdev->open_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) /* DVB USB Driver stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) static struct dvb_usb_device_properties cxusb_medion_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) static struct dvb_usb_device_properties cxusb_aver_a868r_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) static struct dvb_usb_device_properties cxusb_d680_dmb_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) static struct dvb_usb_device_properties cxusb_mygica_d689_properties;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) static int cxusb_medion_priv_init(struct dvb_usb_device *dvbdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) struct cxusb_medion_dev *cxdev = dvbdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) cxdev->dvbdev = dvbdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) cxdev->open_type = CXUSB_OPEN_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) mutex_init(&cxdev->open_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) static void cxusb_medion_priv_destroy(struct dvb_usb_device *dvbdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) struct cxusb_medion_dev *cxdev = dvbdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) mutex_destroy(&cxdev->open_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static bool cxusb_medion_check_altsetting(struct usb_host_interface *as)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) unsigned int ctr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) for (ctr = 0; ctr < as->desc.bNumEndpoints; ctr++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) if ((as->endpoint[ctr].desc.bEndpointAddress &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) USB_ENDPOINT_NUMBER_MASK) != 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) if (as->endpoint[ctr].desc.bEndpointAddress & USB_DIR_IN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) ((as->endpoint[ctr].desc.bmAttributes &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_ISOC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) static bool cxusb_medion_check_intf(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) unsigned int ctr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) if (intf->num_altsetting < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) dev_err(intf->usb_dev, "no alternate interface");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) for (ctr = 0; ctr < intf->num_altsetting; ctr++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) if (intf->altsetting[ctr].desc.bAlternateSetting != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) if (cxusb_medion_check_altsetting(&intf->altsetting[ctr]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) dev_err(intf->usb_dev, "no iso interface");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) static int cxusb_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) struct dvb_usb_device *dvbdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) /* Medion 95700 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) if (!dvb_usb_device_init(intf, &cxusb_medion_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) THIS_MODULE, &dvbdev, adapter_nr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) if (!cxusb_medion_check_intf(intf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) goto ret_uninit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) _cxusb_power_ctrl(dvbdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) ret = cxusb_medion_set_mode(dvbdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) goto ret_uninit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) ret = cxusb_medion_register_analog(dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) cxusb_medion_set_mode(dvbdev, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) _cxusb_power_ctrl(dvbdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) if (ret != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) goto ret_uninit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) /* release device from INIT mode to normal operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) cxusb_medion_put(dvbdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) } else if (!dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) &cxusb_bluebird_lgh064f_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) !dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) &cxusb_bluebird_dee1601_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) !dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) &cxusb_bluebird_lgz201_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) !dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) &cxusb_bluebird_dtt7579_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) !dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) &cxusb_bluebird_dualdig4_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) !dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) &cxusb_bluebird_nano2_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) !dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) &cxusb_bluebird_nano2_needsfirmware_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) !dvb_usb_device_init(intf, &cxusb_aver_a868r_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) !dvb_usb_device_init(intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) &cxusb_bluebird_dualdig4_rev2_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) !dvb_usb_device_init(intf, &cxusb_d680_dmb_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) !dvb_usb_device_init(intf, &cxusb_mygica_d689_properties,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) THIS_MODULE, NULL, adapter_nr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) ret_uninit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) dvb_usb_device_exit(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) static void cxusb_disconnect(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) struct dvb_usb_device *d = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) struct cxusb_state *st = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) if (d->props.devices[0].warm_ids[0] == &cxusb_table[MEDION_MD95700])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) cxusb_medion_unregister_analog(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) /* remove I2C client for tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) client = st->i2c_client_tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) if (client) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) module_put(client->dev.driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) /* remove I2C client for demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) client = st->i2c_client_demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) if (client) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) module_put(client->dev.driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) dvb_usb_device_exit(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) static struct usb_device_id cxusb_table[NR__cxusb_table_index + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) [MEDION_MD95700] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) USB_DEVICE(USB_VID_MEDION, USB_PID_MEDION_MD95700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) [DVICO_BLUEBIRD_LG064F_COLD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_COLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) [DVICO_BLUEBIRD_LG064F_WARM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) [DVICO_BLUEBIRD_DUAL_1_COLD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_COLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) [DVICO_BLUEBIRD_DUAL_1_WARM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_WARM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) [DVICO_BLUEBIRD_LGZ201_COLD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_COLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) [DVICO_BLUEBIRD_LGZ201_WARM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_WARM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) [DVICO_BLUEBIRD_TH7579_COLD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_COLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) [DVICO_BLUEBIRD_TH7579_WARM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_WARM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) [DIGITALNOW_BLUEBIRD_DUAL_1_COLD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) USB_DEVICE(USB_VID_DVICO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) [DIGITALNOW_BLUEBIRD_DUAL_1_WARM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) USB_DEVICE(USB_VID_DVICO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) [DVICO_BLUEBIRD_DUAL_2_COLD] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) [DVICO_BLUEBIRD_DUAL_2_WARM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) [DVICO_BLUEBIRD_DUAL_4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) [DVICO_BLUEBIRD_DVB_T_NANO_2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) [DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) USB_DEVICE(USB_VID_DVICO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) [AVERMEDIA_VOLAR_A868R] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_A868R)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) [DVICO_BLUEBIRD_DUAL_4_REV_2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) [CONEXANT_D680_DMB] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) USB_DEVICE(USB_VID_CONEXANT, USB_PID_CONEXANT_D680_DMB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) [MYGICA_D689] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_D689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) {} /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) MODULE_DEVICE_TABLE(usb, cxusb_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) static struct dvb_usb_device_properties cxusb_medion_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) .size_of_priv = sizeof(struct cxusb_medion_dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) .priv_init = cxusb_medion_priv_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) .priv_destroy = cxusb_medion_priv_destroy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) .frontend_attach = cxusb_cx22702_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) .tuner_attach = cxusb_fmd1216me_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) .power_ctrl = cxusb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) "Medion MD95700 (MDUSBTV-HYBRID)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) { &cxusb_table[MEDION_MD95700], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) .usb_ctrl = DEVICE_SPECIFIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) .firmware = "dvb-usb-bluebird-01.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) .download_firmware = bluebird_patch_dvico_firmware_download,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) * use usb alt setting 0 for EP4 transfer (dvb-t),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) * use usb alt setting 7 for EP2 transfer (atsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) .frontend_attach = cxusb_lgdt3303_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) .tuner_attach = cxusb_lgh064f_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) .power_ctrl = cxusb_bluebird_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) .rc_codes = RC_MAP_DVICO_PORTABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) .rc_query = cxusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) { "DViCO FusionHDTV5 USB Gold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) { &cxusb_table[DVICO_BLUEBIRD_LG064F_COLD], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) { &cxusb_table[DVICO_BLUEBIRD_LG064F_WARM], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) .usb_ctrl = DEVICE_SPECIFIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) .firmware = "dvb-usb-bluebird-01.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) .download_firmware = bluebird_patch_dvico_firmware_download,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) * use usb alt setting 0 for EP4 transfer (dvb-t),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) * use usb alt setting 7 for EP2 transfer (atsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) .frontend_attach = cxusb_dee1601_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) .tuner_attach = cxusb_dee1601_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) .endpoint = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) .power_ctrl = cxusb_bluebird_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) .rc_codes = RC_MAP_DVICO_MCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) .rc_query = cxusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) .num_device_descs = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) { "DViCO FusionHDTV DVB-T Dual USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) { &cxusb_table[DVICO_BLUEBIRD_DUAL_1_COLD], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) { &cxusb_table[DVICO_BLUEBIRD_DUAL_1_WARM], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) { "DigitalNow DVB-T Dual USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) { &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_COLD], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) { &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_WARM], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) { "DViCO FusionHDTV DVB-T Dual Digital 2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) { &cxusb_table[DVICO_BLUEBIRD_DUAL_2_COLD], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) { &cxusb_table[DVICO_BLUEBIRD_DUAL_2_WARM], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) .usb_ctrl = DEVICE_SPECIFIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) .firmware = "dvb-usb-bluebird-01.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) .download_firmware = bluebird_patch_dvico_firmware_download,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) * use usb alt setting 0 for EP4 transfer (dvb-t),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) * use usb alt setting 7 for EP2 transfer (atsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) .frontend_attach = cxusb_mt352_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) .tuner_attach = cxusb_lgz201_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) .endpoint = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) .power_ctrl = cxusb_bluebird_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) .rc_codes = RC_MAP_DVICO_PORTABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) .rc_query = cxusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) { "DViCO FusionHDTV DVB-T USB (LGZ201)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) { &cxusb_table[DVICO_BLUEBIRD_LGZ201_COLD], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) { &cxusb_table[DVICO_BLUEBIRD_LGZ201_WARM], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) .usb_ctrl = DEVICE_SPECIFIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) .firmware = "dvb-usb-bluebird-01.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) .download_firmware = bluebird_patch_dvico_firmware_download,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) * use usb alt setting 0 for EP4 transfer (dvb-t),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) * use usb alt setting 7 for EP2 transfer (atsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) .frontend_attach = cxusb_mt352_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) .tuner_attach = cxusb_dtt7579_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) .endpoint = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) .power_ctrl = cxusb_bluebird_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) .rc_codes = RC_MAP_DVICO_PORTABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) .rc_query = cxusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) { "DViCO FusionHDTV DVB-T USB (TH7579)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) { &cxusb_table[DVICO_BLUEBIRD_TH7579_COLD], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) { &cxusb_table[DVICO_BLUEBIRD_TH7579_WARM], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) .frontend_attach = cxusb_dualdig4_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) .power_ctrl = cxusb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) .rc_codes = RC_MAP_DVICO_MCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) .rc_query = cxusb_bluebird2_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) { "DViCO FusionHDTV DVB-T Dual Digital 4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) { &cxusb_table[DVICO_BLUEBIRD_DUAL_4], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) .identify_state = bluebird_fx2_identify_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) .frontend_attach = cxusb_nano2_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) .power_ctrl = cxusb_nano2_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) .rc_codes = RC_MAP_DVICO_PORTABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) .rc_query = cxusb_bluebird2_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) { "DViCO FusionHDTV DVB-T NANO2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) static struct dvb_usb_device_properties
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) cxusb_bluebird_nano2_needsfirmware_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) .usb_ctrl = DEVICE_SPECIFIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) .firmware = "dvb-usb-bluebird-02.fw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) .download_firmware = bluebird_patch_dvico_firmware_download,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) .identify_state = bluebird_fx2_identify_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) .frontend_attach = cxusb_nano2_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) .power_ctrl = cxusb_nano2_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) .rc_codes = RC_MAP_DVICO_PORTABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) .rc_query = cxusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) .devices = { {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) "DViCO FusionHDTV DVB-T NANO2 w/o firmware",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) .streaming_ctrl = cxusb_aver_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) .frontend_attach = cxusb_aver_lgdt3303_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) .tuner_attach = cxusb_mxl5003s_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) .endpoint = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) .power_ctrl = cxusb_aver_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) { "AVerMedia AVerTVHD Volar (A868R)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) { &cxusb_table[AVERMEDIA_VOLAR_A868R], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) .size_of_priv = sizeof(struct dib0700_adapter_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) .streaming_ctrl = cxusb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) .frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) .tuner_attach = cxusb_dualdig4_rev2_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) .count = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) .buffersize = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) .power_ctrl = cxusb_bluebird_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) .rc_codes = RC_MAP_DVICO_MCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) .rc_query = cxusb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) .allowed_protos = RC_PROTO_BIT_NEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) { "DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) { &cxusb_table[DVICO_BLUEBIRD_DUAL_4_REV_2], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) .frontend_attach = cxusb_d680_dmb_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) .tuner_attach = cxusb_d680_dmb_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) .power_ctrl = cxusb_d680_dmb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) .rc_codes = RC_MAP_TOTAL_MEDIA_IN_HAND_02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) .rc_query = cxusb_d680_dmb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) .allowed_protos = RC_PROTO_BIT_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) "Conexant DMB-TH Stick",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) { &cxusb_table[CONEXANT_D680_DMB], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) .caps = DVB_USB_IS_AN_I2C_ADAPTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) .usb_ctrl = CYPRESS_FX2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) .size_of_priv = sizeof(struct cxusb_state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) .num_frontends = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) .fe = {{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) .frontend_attach = cxusb_mygica_d689_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) .tuner_attach = cxusb_mygica_d689_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) /* parameter for the MPEG2-data transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) .stream = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) .type = USB_BULK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) .count = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) .endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) .u = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) .bulk = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) .buffersize = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) } },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) .power_ctrl = cxusb_d680_dmb_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) .i2c_algo = &cxusb_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) .generic_bulk_ctrl_endpoint = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) .rc.core = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) .rc_interval = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) .rc_codes = RC_MAP_D680_DMB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) .module_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) .rc_query = cxusb_d680_dmb_rc_query,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) .allowed_protos = RC_PROTO_BIT_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) .num_device_descs = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) .devices = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) "Mygica D689 DMB-TH",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) { NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) { &cxusb_table[MYGICA_D689], NULL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) static struct usb_driver cxusb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) .name = "dvb_usb_cxusb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) .probe = cxusb_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) .disconnect = cxusb_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) .id_table = cxusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) module_usb_driver(cxusb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) MODULE_AUTHOR("Maciej S. Szmigiero <mail@maciej.szmigiero.name>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) MODULE_LICENSE("GPL");