^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Realtek RTL28xxU DVB USB driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2012 Thomas Mair <thomas.mair86@googlemail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "rtl28xxu.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) static int rtl28xxu_disable_rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) module_param_named(disable_rc, rtl28xxu_disable_rc, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) MODULE_PARM_DESC(disable_rc, "disable RTL2832U remote controller");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct rtl28xxu_dev *dev = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) u8 requesttype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) mutex_lock(&d->usb_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) if (req->size > sizeof(dev->buf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) dev_err(&d->intf->dev, "too large message %u\n", req->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) goto err_mutex_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) if (req->index & CMD_WR_FLAG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /* write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) memcpy(dev->buf, req->data, req->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) requesttype = (USB_TYPE_VENDOR | USB_DIR_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) pipe = usb_sndctrlpipe(d->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * Zero-length transfers must use usb_sndctrlpipe() and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * rtl28xxu_identify_state() uses a zero-length i2c read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * command to determine the chip type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (req->size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) pipe = usb_rcvctrlpipe(d->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) pipe = usb_sndctrlpipe(d->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) req->index, dev->buf, req->size, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) dvb_usb_dbg_usb_control_msg(d->udev, 0, requesttype, req->value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) req->index, dev->buf, req->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) goto err_mutex_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* read request, copy returned data to return buf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) if (requesttype == (USB_TYPE_VENDOR | USB_DIR_IN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) memcpy(req->data, dev->buf, req->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) mutex_unlock(&d->usb_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) err_mutex_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) mutex_unlock(&d->usb_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) static int rtl28xxu_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct rtl28xxu_req req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) if (reg < 0x3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) req.index = CMD_USB_WR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) else if (reg < 0x4000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) req.index = CMD_SYS_WR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) req.index = CMD_IR_WR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) req.value = reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) req.size = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) req.data = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) return rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static int rtl28xxu_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct rtl28xxu_req req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (reg < 0x3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) req.index = CMD_USB_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) else if (reg < 0x4000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) req.index = CMD_SYS_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) req.index = CMD_IR_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) req.value = reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) req.size = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) req.data = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) return rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) static int rtl28xxu_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return rtl28xxu_wr_regs(d, reg, &val, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static int rtl28xxu_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) return rtl28xxu_rd_regs(d, reg, val, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) static int rtl28xxu_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) u8 mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /* no need for read if whole reg is written */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (mask != 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) ret = rtl28xxu_rd_reg(d, reg, &tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) val &= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) tmp &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) val |= tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) return rtl28xxu_wr_reg(d, reg, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) struct dvb_usb_device *d = i2c_get_adapdata(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) struct rtl28xxu_dev *dev = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) struct rtl28xxu_req req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * It is not known which are real I2C bus xfer limits, but testing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * with RTL2831U + MT2060 gives max RD 24 and max WR 22 bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * TODO: find out RTL2832U lens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) */
^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) * I2C adapter logic looks rather complicated due to fact it handles
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * three different access methods. Those methods are;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * 1) integrated demod access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * 2) old I2C access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * 3) new I2C access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * Used method is selected in order 1, 2, 3. Method 3 can handle all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * requests but there is two reasons why not use it always;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * 1) It is most expensive, usually two USB messages are needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * 2) At least RTL2831U does not support it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * Method 3 is needed in case of I2C write+read (typical register read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * where write is more than one byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (num == 2 && !(msg[0].flags & I2C_M_RD) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) (msg[1].flags & I2C_M_RD)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) if (msg[0].len > 24 || msg[1].len > 24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /* TODO: check msg[0].len max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) goto err_mutex_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) } else if (msg[0].addr == 0x10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* method 1 - integrated demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (msg[0].buf[0] == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* return demod page from driver cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) msg[1].buf[0] = dev->page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) req.index = CMD_DEMOD_RD | dev->page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) req.size = msg[1].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) req.data = &msg[1].buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) } else if (msg[0].len < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* method 2 - old I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) req.index = CMD_I2C_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) req.size = msg[1].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) req.data = &msg[1].buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /* method 3 - new I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) req.value = (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) req.index = CMD_I2C_DA_WR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) req.size = msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) req.data = msg[0].buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) goto err_mutex_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) req.value = (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) req.index = CMD_I2C_DA_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) req.size = msg[1].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) req.data = msg[1].buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) } else if (num == 1 && !(msg[0].flags & I2C_M_RD)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (msg[0].len > 22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /* TODO: check msg[0].len max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) goto err_mutex_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) } else if (msg[0].addr == 0x10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* method 1 - integrated demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (msg[0].buf[0] == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /* save demod page for later demod access */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) dev->page = msg[0].buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) req.value = (msg[0].buf[0] << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) req.index = CMD_DEMOD_WR | dev->page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) req.size = msg[0].len-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) req.data = &msg[0].buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) } else if ((msg[0].len < 23) && (!dev->new_i2c_write)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /* method 2 - old I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) req.index = CMD_I2C_WR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) req.size = msg[0].len-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) req.data = &msg[0].buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* method 3 - new I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) req.value = (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) req.index = CMD_I2C_DA_WR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) req.size = msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) req.data = msg[0].buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) } else if (num == 1 && (msg[0].flags & I2C_M_RD)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) req.value = (msg[0].addr << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) req.index = CMD_I2C_DA_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) req.size = msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) req.data = msg[0].buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) ret = rtl28xxu_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /* Retry failed I2C messages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) if (ret == -EPIPE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) ret = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) err_mutex_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return ret ? ret : num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) static u32 rtl28xxu_i2c_func(struct i2c_adapter *adapter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return I2C_FUNC_I2C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) static struct i2c_algorithm rtl28xxu_i2c_algo = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) .master_xfer = rtl28xxu_i2c_xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .functionality = rtl28xxu_i2c_func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) static int rtl2831u_read_config(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) u8 buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* open RTL2831U/RTL2830 I2C gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x08"};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /* tuner probes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) struct rtl28xxu_req req_mt2060 = {0x00c0, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) struct rtl28xxu_req req_qt1010 = {0x0fc4, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) * RTL2831U GPIOs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * =========================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * GPIO0 | tuner#0 | 0 off | 1 on | MXL5005S (?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * GPIO2 | LED | 0 off | 1 on |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * GPIO4 | tuner#1 | 0 on | 1 off | MT2060
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /* GPIO direction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ret = rtl28xxu_wr_reg(d, SYS_GPIO_DIR, 0x0a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) /* enable as output GPIO0, GPIO2, GPIO4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_EN, 0x15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * Probe used tuner. We need to know used tuner before demod attach
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) * since there is some demod params needed to set according to tuner.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* demod needs some time to wake up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) dev->tuner_name = "NONE";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) /* open demod I2C gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* check QT1010 ID(?) register; reg=0f val=2c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) ret = rtl28xxu_ctrl_msg(d, &req_qt1010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (ret == 0 && buf[0] == 0x2c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) dev->tuner = TUNER_RTL2830_QT1010;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) dev->tuner_name = "QT1010";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) goto found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* open demod I2C gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /* check MT2060 ID register; reg=00 val=63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) ret = rtl28xxu_ctrl_msg(d, &req_mt2060);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if (ret == 0 && buf[0] == 0x63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) dev->tuner = TUNER_RTL2830_MT2060;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) dev->tuner_name = "MT2060";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) goto found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* assume MXL5005S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) dev->tuner = TUNER_RTL2830_MXL5005S;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) dev->tuner_name = "MXL5005S";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) goto found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) found:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) dev_dbg(&d->intf->dev, "tuner=%s\n", dev->tuner_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) static int rtl2832u_read_config(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) u8 buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* open RTL2832U/RTL2832 I2C gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /* close RTL2832U/RTL2832 I2C gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* tuner probes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct rtl28xxu_req req_r820t = {0x0034, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) struct rtl28xxu_req req_r828d = {0x0074, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct rtl28xxu_req req_mn88472 = {0xff38, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) struct rtl28xxu_req req_mn88473 = {0xff38, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct rtl28xxu_req req_cxd2837er = {0xfdd8, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct rtl28xxu_req req_si2157 = {0x00c0, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) struct rtl28xxu_req req_si2168 = {0x00c8, CMD_I2C_RD, 1, buf};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) /* enable GPIO3 and GPIO6 as output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x48, 0x48);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) * Probe used tuner. We need to know used tuner before demod attach
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) * since there is some demod params needed to set according to tuner.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) /* open demod I2C gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) dev->tuner_name = "NONE";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /* check FC0012 ID register; reg=00 val=a1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) ret = rtl28xxu_ctrl_msg(d, &req_fc0012);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (ret == 0 && buf[0] == 0xa1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) dev->tuner = TUNER_RTL2832_FC0012;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) dev->tuner_name = "FC0012";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) /* check FC0013 ID register; reg=00 val=a3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) ret = rtl28xxu_ctrl_msg(d, &req_fc0013);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (ret == 0 && buf[0] == 0xa3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) dev->tuner = TUNER_RTL2832_FC0013;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) dev->tuner_name = "FC0013";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) /* check MT2266 ID register; reg=00 val=85 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) ret = rtl28xxu_ctrl_msg(d, &req_mt2266);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) if (ret == 0 && buf[0] == 0x85) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) dev->tuner = TUNER_RTL2832_MT2266;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) dev->tuner_name = "MT2266";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) goto tuner_found;
^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) /* check FC2580 ID register; reg=01 val=56 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) ret = rtl28xxu_ctrl_msg(d, &req_fc2580);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) if (ret == 0 && buf[0] == 0x56) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) dev->tuner = TUNER_RTL2832_FC2580;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) dev->tuner_name = "FC2580";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /* check MT2063 ID register; reg=00 val=9e || 9c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) ret = rtl28xxu_ctrl_msg(d, &req_mt2063);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) dev->tuner = TUNER_RTL2832_MT2063;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) dev->tuner_name = "MT2063";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* check MAX3543 ID register; reg=00 val=38 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) ret = rtl28xxu_ctrl_msg(d, &req_max3543);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (ret == 0 && buf[0] == 0x38) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) dev->tuner = TUNER_RTL2832_MAX3543;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) dev->tuner_name = "MAX3543";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /* check TUA9001 ID register; reg=7e val=2328 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) ret = rtl28xxu_ctrl_msg(d, &req_tua9001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) dev->tuner = TUNER_RTL2832_TUA9001;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) dev->tuner_name = "TUA9001";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) /* check MXL5007R ID register; reg=d9 val=14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ret = rtl28xxu_ctrl_msg(d, &req_mxl5007t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) if (ret == 0 && buf[0] == 0x14) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) dev->tuner = TUNER_RTL2832_MXL5007T;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) dev->tuner_name = "MXL5007T";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) /* check E4000 ID register; reg=02 val=40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) ret = rtl28xxu_ctrl_msg(d, &req_e4000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (ret == 0 && buf[0] == 0x40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) dev->tuner = TUNER_RTL2832_E4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) dev->tuner_name = "E4000";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) /* check TDA18272 ID register; reg=00 val=c760 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) ret = rtl28xxu_ctrl_msg(d, &req_tda18272);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) dev->tuner = TUNER_RTL2832_TDA18272;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) dev->tuner_name = "TDA18272";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) /* check R820T ID register; reg=00 val=69 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) ret = rtl28xxu_ctrl_msg(d, &req_r820t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) if (ret == 0 && buf[0] == 0x69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) dev->tuner = TUNER_RTL2832_R820T;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) dev->tuner_name = "R820T";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) /* check R828D ID register; reg=00 val=69 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) ret = rtl28xxu_ctrl_msg(d, &req_r828d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) if (ret == 0 && buf[0] == 0x69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) dev->tuner = TUNER_RTL2832_R828D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) dev->tuner_name = "R828D";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) /* GPIO0 and GPIO5 to reset Si2157/Si2168 tuner and demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x00, 0x21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x00, 0x21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x21, 0x21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x21, 0x21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) /* check Si2157 ID register; reg=c0 val=80 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) ret = rtl28xxu_ctrl_msg(d, &req_si2157);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) if (ret == 0 && ((buf[0] & 0x80) == 0x80)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) dev->tuner = TUNER_RTL2832_SI2157;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) dev->tuner_name = "SI2157";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) goto tuner_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) tuner_found:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) dev_dbg(&d->intf->dev, "tuner=%s\n", dev->tuner_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) /* probe slave demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (dev->tuner == TUNER_RTL2832_R828D) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) /* power off slave demod on GPIO0 to reset CXD2837ER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x00, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x00, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) msleep(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* power on slave demod on GPIO0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) /* slave demod needs some time to wake up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) /* check slave answers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) ret = rtl28xxu_ctrl_msg(d, &req_mn88472);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) if (ret == 0 && buf[0] == 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) dev_dbg(&d->intf->dev, "MN88472 found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) dev->slave_demod = SLAVE_DEMOD_MN88472;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) goto demod_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) ret = rtl28xxu_ctrl_msg(d, &req_mn88473);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) if (ret == 0 && buf[0] == 0x03) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) dev_dbg(&d->intf->dev, "MN88473 found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) dev->slave_demod = SLAVE_DEMOD_MN88473;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) goto demod_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) ret = rtl28xxu_ctrl_msg(d, &req_cxd2837er);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) if (ret == 0 && buf[0] == 0xb1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) dev_dbg(&d->intf->dev, "CXD2837ER found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) dev->slave_demod = SLAVE_DEMOD_CXD2837ER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) goto demod_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) if (dev->tuner == TUNER_RTL2832_SI2157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) /* check Si2168 ID register; reg=c8 val=80 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) ret = rtl28xxu_ctrl_msg(d, &req_si2168);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (ret == 0 && ((buf[0] & 0x80) == 0x80)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) dev_dbg(&d->intf->dev, "Si2168 found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) dev->slave_demod = SLAVE_DEMOD_SI2168;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) goto demod_found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) demod_found:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) /* close demod I2C gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) ret = rtl28xxu_ctrl_msg(d, &req_gate_close);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) static int rtl28xxu_read_config(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (dev->chip_id == CHIP_ID_RTL2831U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) return rtl2831u_read_config(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) return rtl2832u_read_config(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) static int rtl28xxu_identify_state(struct dvb_usb_device *d, const char **name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct rtl28xxu_req req_demod_i2c = {0x0020, CMD_I2C_DA_RD, 0, NULL};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) * Detect chip type using I2C command that is not supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) * by old RTL2831U.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) ret = rtl28xxu_ctrl_msg(d, &req_demod_i2c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) if (ret == -EPIPE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) dev->chip_id = CHIP_ID_RTL2831U;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) } else if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) dev->chip_id = CHIP_ID_RTL2832U;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) dev_err(&d->intf->dev, "chip type detection failed %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) dev_dbg(&d->intf->dev, "chip_id=%u\n", dev->chip_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) /* Retry failed I2C messages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) d->i2c_adap.retries = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) d->i2c_adap.timeout = msecs_to_jiffies(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) return WARM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) static const struct rtl2830_platform_data rtl2830_mt2060_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) .spec_inv = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) .vtop = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) .krf = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) .agc_targ_val = 0x2d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) static const struct rtl2830_platform_data rtl2830_qt1010_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) .spec_inv = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) .vtop = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) .krf = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) .agc_targ_val = 0x2d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) static const struct rtl2830_platform_data rtl2830_mxl5005s_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) .spec_inv = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) .vtop = 0x3f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) .krf = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) .agc_targ_val = 0x3e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) struct i2c_board_info board_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) switch (dev->tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) case TUNER_RTL2830_QT1010:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) *pdata = rtl2830_qt1010_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) case TUNER_RTL2830_MT2060:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) *pdata = rtl2830_mt2060_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) case TUNER_RTL2830_MXL5005S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) *pdata = rtl2830_mxl5005s_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) dev_err(&d->intf->dev, "unknown tuner %s\n", dev->tuner_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) /* attach demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) memset(&board_info, 0, sizeof(board_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) strscpy(board_info.type, "rtl2830", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) board_info.addr = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) board_info.platform_data = pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) request_module("%s", board_info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) client = i2c_new_client_device(&d->i2c_adap, &board_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) if (!i2c_client_has_driver(client)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) goto err;
^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) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) adap->fe[0] = pdata->get_dvb_frontend(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) dev->demod_i2c_adapter = pdata->get_i2c_adapter(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) dev->i2c_client_demod = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) static const struct rtl2832_platform_data rtl2832_fc2580_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) .tuner = TUNER_RTL2832_FC2580,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) static const struct rtl2832_platform_data rtl2832_fc0012_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) .tuner = TUNER_RTL2832_FC0012
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) static const struct rtl2832_platform_data rtl2832_fc0013_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) .tuner = TUNER_RTL2832_FC0013
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) static const struct rtl2832_platform_data rtl2832_tua9001_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) .tuner = TUNER_RTL2832_TUA9001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) static const struct rtl2832_platform_data rtl2832_e4000_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) .tuner = TUNER_RTL2832_E4000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) static const struct rtl2832_platform_data rtl2832_r820t_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) .tuner = TUNER_RTL2832_R820T,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) static const struct rtl2832_platform_data rtl2832_si2157_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) .clk = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) .tuner = TUNER_RTL2832_SI2157,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) int cmd, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) dev_dbg(&d->intf->dev, "cmd=%d arg=%d\n", cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) case FC_FE_CALLBACK_VHF_ENABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) /* set output values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) ret = rtl28xxu_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) if (arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) val &= 0xbf; /* set GPIO6 low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) val |= 0x40; /* set GPIO6 high */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_VAL, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) static int rtl2832u_tua9001_tuner_callback(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) int cmd, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) dev_dbg(&d->intf->dev, "cmd=%d arg=%d\n", cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) * CEN always enabled by hardware wiring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) * RESETN GPIO4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) * RXEN GPIO1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) case TUA9001_CMD_RESETN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) if (arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) val = (1 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) val = (0 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, val, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) case TUA9001_CMD_RXEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) if (arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) val = (1 << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) val = (0 << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, val, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) break;
^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) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) static int rtl2832u_frontend_callback(void *adapter_priv, int component,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) int cmd, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) struct i2c_adapter *adapter = adapter_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) struct device *parent = adapter->dev.parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) struct i2c_adapter *parent_adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) struct dvb_usb_device *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) struct rtl28xxu_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) * All tuners are connected to demod muxed I2C adapter. We have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * resolve its parent adapter in order to get handle for this driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) * private data. That is a bit hackish solution, GPIO or direct driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * callback would be better...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if (parent != NULL && parent->type == &i2c_adapter_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) parent_adapter = to_i2c_adapter(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) d = i2c_get_adapdata(parent_adapter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) dev = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) dev_dbg(&d->intf->dev, "component=%d cmd=%d arg=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) component, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) switch (component) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) case DVB_FRONTEND_COMPONENT_TUNER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) switch (dev->tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) case TUNER_RTL2832_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) case TUNER_RTL2832_TUA9001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) return rtl2832u_tua9001_tuner_callback(d, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) struct i2c_board_info board_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) switch (dev->tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) case TUNER_RTL2832_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) *pdata = rtl2832_fc0012_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) case TUNER_RTL2832_FC0013:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) *pdata = rtl2832_fc0013_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) case TUNER_RTL2832_FC2580:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) *pdata = rtl2832_fc2580_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) case TUNER_RTL2832_TUA9001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) *pdata = rtl2832_tua9001_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) case TUNER_RTL2832_E4000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) *pdata = rtl2832_e4000_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) case TUNER_RTL2832_R820T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) case TUNER_RTL2832_R828D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) *pdata = rtl2832_r820t_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) case TUNER_RTL2832_SI2157:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) *pdata = rtl2832_si2157_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) dev_err(&d->intf->dev, "unknown tuner %s\n", dev->tuner_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) /* attach demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) memset(&board_info, 0, sizeof(board_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) strscpy(board_info.type, "rtl2832", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) board_info.addr = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) board_info.platform_data = pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) request_module("%s", board_info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) client = i2c_new_client_device(&d->i2c_adap, &board_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) if (!i2c_client_has_driver(client)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) goto err;
^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) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) adap->fe[0] = pdata->get_dvb_frontend(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) dev->demod_i2c_adapter = pdata->get_i2c_adapter(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) dev->i2c_client_demod = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) /* set fe callback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) adap->fe[0]->callback = rtl2832u_frontend_callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) if (dev->slave_demod) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) struct i2c_board_info info = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) * We continue on reduced mode, without DVB-T2/C, using master
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) * demod, when slave demod fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) /* attach slave demodulator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) if (dev->slave_demod == SLAVE_DEMOD_MN88472) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) struct mn88472_config mn88472_config = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) mn88472_config.fe = &adap->fe[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) mn88472_config.i2c_wr_max = 22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) strscpy(info.type, "mn88472", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) mn88472_config.xtal = 20500000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) mn88472_config.ts_mode = SERIAL_TS_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) mn88472_config.ts_clock = VARIABLE_TS_CLOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) info.addr = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) info.platform_data = &mn88472_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) request_module(info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) client = i2c_new_client_device(&d->i2c_adap, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) if (!i2c_client_has_driver(client)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) dev->slave_demod = SLAVE_DEMOD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) goto err_slave_demod_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) dev->slave_demod = SLAVE_DEMOD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) goto err_slave_demod_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) dev->i2c_client_slave_demod = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) } else if (dev->slave_demod == SLAVE_DEMOD_MN88473) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) struct mn88473_config mn88473_config = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) mn88473_config.fe = &adap->fe[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) mn88473_config.i2c_wr_max = 22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) strscpy(info.type, "mn88473", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) info.addr = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) info.platform_data = &mn88473_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) request_module(info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) client = i2c_new_client_device(&d->i2c_adap, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) if (!i2c_client_has_driver(client)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) dev->slave_demod = SLAVE_DEMOD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) goto err_slave_demod_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) dev->slave_demod = SLAVE_DEMOD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) goto err_slave_demod_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) dev->i2c_client_slave_demod = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) } else if (dev->slave_demod == SLAVE_DEMOD_CXD2837ER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) struct cxd2841er_config cxd2837er_config = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) cxd2837er_config.i2c_addr = 0xd8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) cxd2837er_config.xtal = SONY_XTAL_20500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) cxd2837er_config.flags = (CXD2841ER_AUTO_IFHZ |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) CXD2841ER_NO_AGCNEG | CXD2841ER_TSBITS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) CXD2841ER_EARLY_TUNE | CXD2841ER_TS_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) adap->fe[1] = dvb_attach(cxd2841er_attach_t_c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) &cxd2837er_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (!adap->fe[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) dev->slave_demod = SLAVE_DEMOD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) goto err_slave_demod_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) adap->fe[1]->id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) dev->i2c_client_slave_demod = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) struct si2168_config si2168_config = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) struct i2c_adapter *adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) si2168_config.i2c_adapter = &adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) si2168_config.fe = &adap->fe[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) si2168_config.ts_mode = SI2168_TS_SERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) si2168_config.ts_clock_inv = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) si2168_config.ts_clock_gapped = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) strscpy(info.type, "si2168", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) info.addr = 0x64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) info.platform_data = &si2168_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) request_module(info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) client = i2c_new_client_device(&d->i2c_adap, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (!i2c_client_has_driver(client)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) dev->slave_demod = SLAVE_DEMOD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) goto err_slave_demod_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) dev->slave_demod = SLAVE_DEMOD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) goto err_slave_demod_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) dev->i2c_client_slave_demod = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) /* for Si2168 devices use only new I2C write method */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) dev->new_i2c_write = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) err_slave_demod_failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) static int rtl28xxu_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) struct rtl28xxu_dev *dev = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) if (dev->chip_id == CHIP_ID_RTL2831U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) return rtl2831u_frontend_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) return rtl2832u_frontend_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) static int rtl28xxu_frontend_detach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) /* remove I2C slave demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) client = dev->i2c_client_slave_demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) if (client) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) module_put(client->dev.driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) /* remove I2C demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) client = dev->i2c_client_demod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) if (client) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) module_put(client->dev.driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) static struct qt1010_config rtl28xxu_qt1010_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) .i2c_address = 0x62, /* 0xc4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) static struct mt2060_config rtl28xxu_mt2060_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) .i2c_address = 0x60, /* 0xc0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) .clock_out = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) static struct mxl5005s_config rtl28xxu_mxl5005s_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) .i2c_address = 0x63, /* 0xc6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) .if_freq = IF_FREQ_4570000HZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) .xtal_freq = CRYSTAL_FREQ_16000000HZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) .agc_mode = MXL_SINGLE_AGC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) .tracking_filter = MXL_TF_C_H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) .rssi_enable = MXL_RSSI_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) .cap_select = MXL_CAP_SEL_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) .div_out = MXL_DIV_OUT_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) .clock_out = MXL_CLOCK_OUT_DISABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) .top = MXL5005S_TOP_25P2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) .mod_mode = MXL_DIGITAL_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) .if_mode = MXL_ZERO_IF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) .AgcMasterByte = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) static int rtl2831u_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) switch (dev->tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) case TUNER_RTL2830_QT1010:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) fe = dvb_attach(qt1010_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) &rtl28xxu_qt1010_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) case TUNER_RTL2830_MT2060:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) fe = dvb_attach(mt2060_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) &rtl28xxu_mt2060_config, 1220);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) case TUNER_RTL2830_MXL5005S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) fe = dvb_attach(mxl5005s_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) &rtl28xxu_mxl5005s_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) fe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) if (fe == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) static const struct fc0012_config rtl2832u_fc0012_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) .i2c_address = 0x63, /* 0xc6 >> 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) .xtal_freq = FC_XTAL_28_8_MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) static const struct r820t_config rtl2832u_r820t_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) .i2c_addr = 0x1a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) .xtal = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) .max_i2c_msg_len = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) .rafael_chip = CHIP_R820T,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) static const struct r820t_config rtl2832u_r828d_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) .i2c_addr = 0x3a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) .xtal = 16000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) .max_i2c_msg_len = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) .rafael_chip = CHIP_R828D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) struct dvb_frontend *fe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) struct i2c_board_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) struct v4l2_subdev *subdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) struct rtl2832_sdr_platform_data pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) memset(&info, 0, sizeof(struct i2c_board_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) memset(&pdata, 0, sizeof(pdata));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) switch (dev->tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) case TUNER_RTL2832_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) fe = dvb_attach(fc0012_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) dev->demod_i2c_adapter, &rtl2832u_fc0012_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) /* since fc0012 includs reading the signal strength delegate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * that to the tuner driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) adap->fe[0]->ops.read_signal_strength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) adap->fe[0]->ops.tuner_ops.get_rf_strength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) case TUNER_RTL2832_FC0013:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) fe = dvb_attach(fc0013_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) dev->demod_i2c_adapter, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) /* fc0013 also supports signal strength reading */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) adap->fe[0]->ops.read_signal_strength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) adap->fe[0]->ops.tuner_ops.get_rf_strength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) case TUNER_RTL2832_E4000: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) struct e4000_config e4000_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) .fe = adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) .clock = 28800000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) strscpy(info.type, "e4000", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) info.addr = 0x64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) info.platform_data = &e4000_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) request_module(info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) client = i2c_new_client_device(dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) if (!i2c_client_has_driver(client))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) dev->i2c_client_tuner = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) subdev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) case TUNER_RTL2832_FC2580: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) struct fc2580_platform_data fc2580_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) .dvb_frontend = adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) struct i2c_board_info board_info = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) strscpy(board_info.type, "fc2580", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) board_info.addr = 0x56;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) board_info.platform_data = &fc2580_pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) request_module("fc2580");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) client = i2c_new_client_device(dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) &board_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) if (!i2c_client_has_driver(client))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) dev->i2c_client_tuner = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) subdev = fc2580_pdata.get_v4l2_subdev(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) case TUNER_RTL2832_TUA9001: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) struct tua9001_platform_data tua9001_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) .dvb_frontend = adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) struct i2c_board_info board_info = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) /* enable GPIO1 and GPIO4 as output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x12, 0x12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) strscpy(board_info.type, "tua9001", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) board_info.addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) board_info.platform_data = &tua9001_pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) request_module("tua9001");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) client = i2c_new_client_device(dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) &board_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) if (!i2c_client_has_driver(client))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) dev->i2c_client_tuner = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) case TUNER_RTL2832_R820T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) fe = dvb_attach(r820t_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) &rtl2832u_r820t_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) /* Use tuner to get the signal strength */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) adap->fe[0]->ops.read_signal_strength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) adap->fe[0]->ops.tuner_ops.get_rf_strength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) case TUNER_RTL2832_R828D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) fe = dvb_attach(r820t_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) &rtl2832u_r828d_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) adap->fe[0]->ops.read_signal_strength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) adap->fe[0]->ops.tuner_ops.get_rf_strength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) if (adap->fe[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) fe = dvb_attach(r820t_attach, adap->fe[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) dev->demod_i2c_adapter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) &rtl2832u_r828d_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) adap->fe[1]->ops.read_signal_strength =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) adap->fe[1]->ops.tuner_ops.get_rf_strength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) case TUNER_RTL2832_SI2157: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) struct si2157_config si2157_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) .fe = adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) .if_port = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) .inversion = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) strscpy(info.type, "si2157", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) info.addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) info.platform_data = &si2157_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) request_module(info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) client = i2c_new_client_device(&d->i2c_adap, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (!i2c_client_has_driver(client))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) dev->i2c_client_tuner = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) subdev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) /* copy tuner ops for 2nd FE as tuner is shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) if (adap->fe[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) adap->fe[1]->tuner_priv =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) adap->fe[0]->tuner_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) memcpy(&adap->fe[1]->ops.tuner_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) &adap->fe[0]->ops.tuner_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) sizeof(struct dvb_tuner_ops));
^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) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) if (fe == NULL && dev->i2c_client_tuner == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) /* register SDR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) switch (dev->tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) case TUNER_RTL2832_FC2580:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) case TUNER_RTL2832_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) case TUNER_RTL2832_FC0013:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) case TUNER_RTL2832_E4000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) case TUNER_RTL2832_R820T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) case TUNER_RTL2832_R828D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) pdata.clk = dev->rtl2832_platform_data.clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) pdata.tuner = dev->tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) pdata.regmap = dev->rtl2832_platform_data.regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) pdata.dvb_frontend = adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) pdata.dvb_usb_device = d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) pdata.v4l2_subdev = subdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) request_module("%s", "rtl2832_sdr");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) pdev = platform_device_register_data(&d->intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) "rtl2832_sdr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) PLATFORM_DEVID_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) &pdata, sizeof(pdata));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) if (IS_ERR(pdev) || pdev->dev.driver == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) dev->platform_device_sdr = pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) dev_dbg(&d->intf->dev, "no SDR for tuner=%d\n", dev->tuner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) static int rtl28xxu_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) struct rtl28xxu_dev *dev = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) if (dev->chip_id == CHIP_ID_RTL2831U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) return rtl2831u_tuner_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) return rtl2832u_tuner_attach(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) static int rtl28xxu_tuner_detach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) /* remove platform SDR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) pdev = dev->platform_device_sdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) if (pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) platform_device_unregister(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) /* remove I2C tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) client = dev->i2c_client_tuner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) if (client) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) module_put(client->dev.driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) static int rtl28xxu_init(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) dev_dbg(&d->intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) /* init USB endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) ret = rtl28xxu_rd_reg(d, USB_SYSCTL_0, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) /* enable DMA and Full Packet Mode*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) val |= 0x09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) ret = rtl28xxu_wr_reg(d, USB_SYSCTL_0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) /* set EPA maximum packet size to 0x0200 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) ret = rtl28xxu_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) /* change EPA FIFO length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) ret = rtl28xxu_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) u8 gpio, sys0, epa_ctl[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) /* demod adc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) ret = rtl28xxu_rd_reg(d, SYS_SYS0, &sys0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) /* tuner power, read GPIOs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) ret = rtl28xxu_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) dev_dbg(&d->intf->dev, "RD SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) if (onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) gpio |= 0x01; /* GPIO0 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) gpio &= (~0x10); /* GPIO4 = 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) gpio |= 0x04; /* GPIO2 = 1, LED on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) sys0 = sys0 & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) sys0 |= 0xe0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) epa_ctl[0] = 0x00; /* clear stall */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) epa_ctl[1] = 0x00; /* clear reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) gpio &= (~0x01); /* GPIO0 = 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) gpio |= 0x10; /* GPIO4 = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) gpio &= (~0x04); /* GPIO2 = 1, LED off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) sys0 = sys0 & (~0xc0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) epa_ctl[0] = 0x10; /* set stall */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) epa_ctl[1] = 0x02; /* set reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) dev_dbg(&d->intf->dev, "WR SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) /* demod adc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) ret = rtl28xxu_wr_reg(d, SYS_SYS0, sys0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) /* tuner power, write GPIOs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) /* streaming EP: stall & reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, epa_ctl, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) if (onoff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) /* GPIO3=1, GPIO4=0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x08, 0x18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) /* suspend? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL1, 0x00, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) /* enable PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x80, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) /* disable reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x20, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) /* streaming EP: clear stall & reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x00\x00", 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) ret = usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) /* GPIO4=1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x10, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) /* disable PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x00, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) /* streaming EP: set stall & reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x10\x02", 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) if (dev->chip_id == CHIP_ID_RTL2831U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) return rtl2831u_power_ctrl(d, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) return rtl2832u_power_ctrl(d, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) static int rtl28xxu_frontend_ctrl(struct dvb_frontend *fe, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) struct dvb_usb_device *d = fe_to_d(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) struct rtl28xxu_dev *dev = fe_to_priv(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) dev_dbg(&d->intf->dev, "fe=%d onoff=%d\n", fe->id, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) if (dev->chip_id == CHIP_ID_RTL2831U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) if (fe->id == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) /* control internal demod ADC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) val = 0x48; /* enable ADC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) val = 0x00; /* disable ADC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, val, 0x48);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) } else if (fe->id == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) /* bypass slave demod TS through master demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) ret = pdata->slave_ts_ctrl(dev->i2c_client_demod, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) #if IS_ENABLED(CONFIG_RC_CORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) static int rtl2831u_rc_query(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) struct rtl28xxu_dev *dev = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) u8 buf[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) u32 rc_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) static const struct rtl28xxu_reg_val rc_nec_tab[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) { 0x3033, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) { 0x3020, 0x43 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) { 0x3021, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) { 0x3022, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) { 0x3023, 0x5a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) { 0x3024, 0x2d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) { 0x3025, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) { 0x3026, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) { 0x3028, 0xb0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) { 0x3029, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) { 0x302c, 0x88 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) { 0x302e, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) { 0x3030, 0xdf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) { 0x3031, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) /* init remote controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) if (!dev->rc_active) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) ret = rtl28xxu_wr_reg(d, rc_nec_tab[i].reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) rc_nec_tab[i].val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) dev->rc_active = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) ret = rtl28xxu_rd_regs(d, SYS_IRRC_RP, buf, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) if (buf[4] & 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) enum rc_proto proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) if (buf[2] == (u8) ~buf[3]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) if (buf[0] == (u8) ~buf[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) /* NEC standard (16 bit) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) rc_code = RC_SCANCODE_NEC(buf[0], buf[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) proto = RC_PROTO_NEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) /* NEC extended (24 bit) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) rc_code = RC_SCANCODE_NECX(buf[0] << 8 | buf[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) buf[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) proto = RC_PROTO_NECX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) /* NEC full (32 bit) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) rc_code = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) buf[2] << 8 | buf[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) proto = RC_PROTO_NEC32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) rc_keydown(d->rc_dev, proto, rc_code, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) /* repeated intentionally to avoid extra keypress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) static int rtl2831u_get_rc_config(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) struct dvb_usb_rc *rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) rc->map_name = RC_MAP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) rc->allowed_protos = RC_PROTO_BIT_NEC | RC_PROTO_BIT_NECX |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) RC_PROTO_BIT_NEC32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) rc->query = rtl2831u_rc_query;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) rc->interval = 400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) static int rtl2832u_rc_query(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) int ret, i, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) struct rtl28xxu_dev *dev = d->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) struct ir_raw_event ev = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) u8 buf[128];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) static const struct rtl28xxu_reg_val_mask refresh_tab[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) {IR_RX_IF, 0x03, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) {IR_RX_BUF_CTRL, 0x80, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) {IR_RX_CTRL, 0x80, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) /* init remote controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) if (!dev->rc_active) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) static const struct rtl28xxu_reg_val_mask init_tab[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) {SYS_DEMOD_CTL1, 0x00, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) {SYS_DEMOD_CTL1, 0x00, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) {USB_CTRL, 0x20, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) {SYS_GPIO_DIR, 0x00, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) {SYS_GPIO_OUT_EN, 0x08, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) {SYS_GPIO_OUT_VAL, 0x08, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) {IR_MAX_DURATION0, 0xd0, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) {IR_MAX_DURATION1, 0x07, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) {IR_IDLE_LEN0, 0xc0, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) {IR_IDLE_LEN1, 0x00, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) {IR_GLITCH_LEN, 0x03, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) {IR_RX_CLK, 0x09, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) {IR_RX_CFG, 0x1c, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) {IR_MAX_H_TOL_LEN, 0x1e, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) {IR_MAX_L_TOL_LEN, 0x1e, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) {IR_RX_CTRL, 0x80, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) for (i = 0; i < ARRAY_SIZE(init_tab); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) ret = rtl28xxu_wr_reg_mask(d, init_tab[i].reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) init_tab[i].val, init_tab[i].mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) dev->rc_active = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) ret = rtl28xxu_rd_reg(d, IR_RX_IF, &buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) if (buf[0] != 0x83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) ret = rtl28xxu_rd_reg(d, IR_RX_BC, &buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) if (ret || buf[0] > sizeof(buf))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) len = buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) /* read raw code from hw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) ret = rtl28xxu_rd_regs(d, IR_RX_BUF, buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) /* let hw receive new code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) for (i = 0; i < ARRAY_SIZE(refresh_tab); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) ret = rtl28xxu_wr_reg_mask(d, refresh_tab[i].reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) refresh_tab[i].val, refresh_tab[i].mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) goto err;
^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) /* pass data to Kernel IR decoder */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) for (i = 0; i < len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) ev.pulse = buf[i] >> 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) ev.duration = 51 * (buf[i] & 0x7f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) ir_raw_event_store_with_filter(d->rc_dev, &ev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) /* 'flush' ir_raw_event_store_with_filter() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) ir_raw_event_handle(d->rc_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) dev_dbg(&d->intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) static int rtl2832u_get_rc_config(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) struct dvb_usb_rc *rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) /* disable IR interrupts in order to avoid SDR sample loss */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) if (rtl28xxu_disable_rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) return rtl28xxu_wr_reg(d, IR_RX_IE, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) /* load empty to enable rc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) if (!rc->map_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) rc->map_name = RC_MAP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) rc->allowed_protos = RC_PROTO_BIT_ALL_IR_DECODER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) rc->driver_type = RC_DRIVER_IR_RAW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) rc->query = rtl2832u_rc_query;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) rc->interval = 200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) /* we program idle len to 0xc0, set timeout to one less */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) rc->timeout = 0xbf * 51;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) static int rtl28xxu_get_rc_config(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) struct dvb_usb_rc *rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) struct rtl28xxu_dev *dev = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) if (dev->chip_id == CHIP_ID_RTL2831U)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) return rtl2831u_get_rc_config(d, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) return rtl2832u_get_rc_config(d, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) #define rtl28xxu_get_rc_config NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) static int rtl28xxu_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) struct rtl28xxu_dev *dev = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) if (dev->chip_id == CHIP_ID_RTL2831U) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) return pdata->pid_filter_ctrl(adap->fe[0], onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) return pdata->pid_filter_ctrl(adap->fe[0], onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) static int rtl28xxu_pid_filter(struct dvb_usb_adapter *adap, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) u16 pid, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) struct rtl28xxu_dev *dev = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) if (dev->chip_id == CHIP_ID_RTL2831U) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) return pdata->pid_filter(adap->fe[0], index, pid, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) return pdata->pid_filter(adap->fe[0], index, pid, onoff);
^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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) static const struct dvb_usb_device_properties rtl28xxu_props = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) .driver_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) .adapter_nr = adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) .size_of_priv = sizeof(struct rtl28xxu_dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) .identify_state = rtl28xxu_identify_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) .power_ctrl = rtl28xxu_power_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) .frontend_ctrl = rtl28xxu_frontend_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) .i2c_algo = &rtl28xxu_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) .read_config = rtl28xxu_read_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) .frontend_attach = rtl28xxu_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) .frontend_detach = rtl28xxu_frontend_detach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) .tuner_attach = rtl28xxu_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) .tuner_detach = rtl28xxu_tuner_detach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) .init = rtl28xxu_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) .get_rc_config = rtl28xxu_get_rc_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) .num_adapters = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) .caps = DVB_USB_ADAP_HAS_PID_FILTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) .pid_filter_count = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) .pid_filter_ctrl = rtl28xxu_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) .pid_filter = rtl28xxu_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) .stream = DVB_USB_STREAM_BULK(0x81, 6, 8 * 512),
^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) static const struct usb_device_id rtl28xxu_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) /* RTL2831U devices: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) { DVB_USB_DEVICE(USB_VID_REALTEK, USB_PID_REALTEK_RTL2831U,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) &rtl28xxu_props, "Realtek RTL2831U reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) { DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) &rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) { DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) &rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) /* RTL2832U devices: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) { DVB_USB_DEVICE(USB_VID_REALTEK, 0x2832,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) &rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) { DVB_USB_DEVICE(USB_VID_REALTEK, 0x2838,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) &rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) &rtl28xxu_props, "TerraTec Cinergy T Stick Black", RC_MAP_TERRATEC_SLIM) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) &rtl28xxu_props, "G-Tek Electronics Group Lifeview LV5TDLX DVB-T", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) &rtl28xxu_props, "TerraTec NOXON DAB Stick", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) &rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 2)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) &rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 3)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_TREKSTOR_TERRES_2_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) &rtl28xxu_props, "Trekstor DVB-T Stick Terres 2.0", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1101,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) &rtl28xxu_props, "Dexatek DK DVB-T Dongle", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6680,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) &rtl28xxu_props, "DigitalNow Quad DVB-T Receiver", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_MINID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) &rtl28xxu_props, "Leadtek Winfast DTV Dongle Mini D", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS_PLUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) &rtl28xxu_props, "Leadtek WinFast DTV2000DS Plus", RC_MAP_LEADTEK_Y04G0051) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) &rtl28xxu_props, "TerraTec Cinergy T Stick RC (Rev. 3)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1102,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) &rtl28xxu_props, "Dexatek DK mini DVB-T Dongle", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) &rtl28xxu_props, "TerraTec Cinergy T Stick+", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd3a8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) &rtl28xxu_props, "ASUS My Cinema-U3100Mini Plus V2", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd393,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) &rtl28xxu_props, "GIGABYTE U7300", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1104,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) &rtl28xxu_props, "MSI DIGIVOX Micro HD", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) { DVB_USB_DEVICE(USB_VID_COMPRO, 0x0620,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) &rtl28xxu_props, "Compro VideoMate U620F", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) { DVB_USB_DEVICE(USB_VID_COMPRO, 0x0650,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) &rtl28xxu_props, "Compro VideoMate U650F", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) &rtl28xxu_props, "MaxMedia HU394-T", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) &rtl28xxu_props, "Leadtek WinFast DTV Dongle mini", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) &rtl28xxu_props, "Crypto ReDi PC 50 A", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) { DVB_USB_DEVICE(USB_VID_KYE, 0x707f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) &rtl28xxu_props, "Genius TVGo DVB-T03", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd395,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) &rtl28xxu_props, "Peak DVB-T USB", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20_RTL2832U,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) &rtl28xxu_props, "Sveon STV20", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) &rtl28xxu_props, "Sveon STV21", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV27,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) &rtl28xxu_props, "Sveon STV27", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TURBOX_DTT_2000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) &rtl28xxu_props, "TURBO-X Pure TV Tuner DTT-2000", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_PROLECTRIX_DV107669,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) &rtl28xxu_props, "PROlectrix DV107669", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) /* RTL2832P devices: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) { DVB_USB_DEVICE(USB_VID_HANFTEK, 0x0131,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) &rtl28xxu_props, "Astrometa DVB-T2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) RC_MAP_ASTROMETA_T2HYBRID) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) { DVB_USB_DEVICE(0x5654, 0xca42,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) &rtl28xxu_props, "GoTView MasterHD 3", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) MODULE_DEVICE_TABLE(usb, rtl28xxu_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) static struct usb_driver rtl28xxu_usb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) .name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) .id_table = rtl28xxu_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) .probe = dvb_usbv2_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) .disconnect = dvb_usbv2_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) .suspend = dvb_usbv2_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) .resume = dvb_usbv2_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) .reset_resume = dvb_usbv2_reset_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) .no_dynamic_id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) .soft_unbind = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) module_usb_driver(rtl28xxu_usb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) MODULE_LICENSE("GPL");