^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) * Afatech AF9035 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) 2012 Antti Palosaari <crope@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "af9035.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /* Max transfer size done by I2C transfer functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define MAX_XFER_SIZE 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static u16 af9035_checksum(const u8 *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) size_t i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) u16 checksum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) for (i = 1; i < len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) if (i % 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) checksum += buf[i] << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) checksum += buf[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) checksum = ~checksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) return checksum;
^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) static int af9035_ctrl_msg(struct dvb_usb_device *d, struct usb_req *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define REQ_HDR_LEN 4 /* send header size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define ACK_HDR_LEN 3 /* rece header size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define CHECKSUM_LEN 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define USB_TIMEOUT 2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) int ret, wlen, rlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u16 checksum, tmp_checksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) mutex_lock(&d->usb_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* buffer overflow check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (req->wlen > (BUF_LEN - REQ_HDR_LEN - CHECKSUM_LEN) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) req->rlen > (BUF_LEN - ACK_HDR_LEN - CHECKSUM_LEN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) dev_err(&intf->dev, "too much data wlen=%d rlen=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) req->wlen, req->rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) state->buf[0] = REQ_HDR_LEN + req->wlen + CHECKSUM_LEN - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) state->buf[1] = req->mbox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) state->buf[2] = req->cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) state->buf[3] = state->seq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) memcpy(&state->buf[REQ_HDR_LEN], req->wbuf, req->wlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) wlen = REQ_HDR_LEN + req->wlen + CHECKSUM_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) rlen = ACK_HDR_LEN + req->rlen + CHECKSUM_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* calc and add checksum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) checksum = af9035_checksum(state->buf, state->buf[0] - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) state->buf[state->buf[0] - 1] = (checksum >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) state->buf[state->buf[0] - 0] = (checksum & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /* no ack for these packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (req->cmd == CMD_FW_DL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) rlen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ret = dvb_usbv2_generic_rw_locked(d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) state->buf, wlen, state->buf, rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /* no ack for those packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (req->cmd == CMD_FW_DL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* verify checksum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) checksum = af9035_checksum(state->buf, rlen - 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) tmp_checksum = (state->buf[rlen - 2] << 8) | state->buf[rlen - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) if (tmp_checksum != checksum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) dev_err(&intf->dev, "command=%02x checksum mismatch (%04x != %04x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) req->cmd, tmp_checksum, checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* check status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) if (state->buf[2]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* fw returns status 1 when IR code was not received */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (req->cmd == CMD_IR_GET || state->buf[2] == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) dev_dbg(&intf->dev, "command=%02x failed fw error=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) req->cmd, state->buf[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* read request, copy returned data to return buf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (req->rlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) memcpy(req->rbuf, &state->buf[ACK_HDR_LEN], req->rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) mutex_unlock(&d->usb_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return ret;
^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) /* write multiple registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static int af9035_wr_regs(struct dvb_usb_device *d, u32 reg, u8 *val, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u8 wbuf[MAX_XFER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) u8 mbox = (reg >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) struct usb_req req = { CMD_MEM_WR, mbox, 6 + len, wbuf, 0, NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) if (6 + len > sizeof(wbuf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) dev_warn(&intf->dev, "i2c wr: len=%d is too big!\n", len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) wbuf[0] = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) wbuf[1] = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) wbuf[2] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) wbuf[3] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) wbuf[4] = (reg >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) wbuf[5] = (reg >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) memcpy(&wbuf[6], val, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) return af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* read multiple registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static int af9035_rd_regs(struct dvb_usb_device *d, u32 reg, u8 *val, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) u8 wbuf[] = { len, 2, 0, 0, (reg >> 8) & 0xff, reg & 0xff };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) u8 mbox = (reg >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct usb_req req = { CMD_MEM_RD, mbox, sizeof(wbuf), wbuf, len, val };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) return af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* write single register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static int af9035_wr_reg(struct dvb_usb_device *d, u32 reg, u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) return af9035_wr_regs(d, reg, &val, 1);
^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) /* read single register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static int af9035_rd_reg(struct dvb_usb_device *d, u32 reg, u8 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) return af9035_rd_regs(d, reg, val, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* write single register with mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static int af9035_wr_reg_mask(struct dvb_usb_device *d, u32 reg, u8 val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) u8 mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /* no need for read if whole reg is written */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) if (mask != 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ret = af9035_rd_regs(d, reg, &tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) val &= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) tmp &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) val |= tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return af9035_wr_regs(d, reg, &val, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) static int af9035_add_i2c_dev(struct dvb_usb_device *d, const char *type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) u8 addr, void *platform_data, struct i2c_adapter *adapter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) int ret, num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct i2c_board_info board_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) .addr = addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .platform_data = platform_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) strscpy(board_info.type, type, I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /* find first free client */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) for (num = 0; num < AF9035_I2C_CLIENT_MAX; num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) if (state->i2c_client[num] == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) dev_dbg(&intf->dev, "num=%d\n", num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) if (num == AF9035_I2C_CLIENT_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) dev_err(&intf->dev, "I2C client out of index\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) request_module("%s", board_info.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /* register I2C device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) client = i2c_new_client_device(adapter, &board_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) if (!i2c_client_has_driver(client)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) /* increase I2C driver usage count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (!try_module_get(client->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) state->i2c_client[num] = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) static void af9035_del_i2c_dev(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* find last used client */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) num = AF9035_I2C_CLIENT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) while (num--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) if (state->i2c_client[num] != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) dev_dbg(&intf->dev, "num=%d\n", num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (num == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) dev_err(&intf->dev, "I2C client out of index\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) client = state->i2c_client[num];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* decrease I2C driver usage count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) module_put(client->dev.driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) /* unregister I2C device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) i2c_unregister_device(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) state->i2c_client[num] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) dev_dbg(&intf->dev, "failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct i2c_msg msg[], int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct dvb_usb_device *d = i2c_get_adapdata(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * AF9035 I2C sub header is 5 bytes long. Meaning of those bytes are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * 0: data len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * 1: I2C addr << 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * 2: reg addr len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) * byte 3 and 4 can be used as reg addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * 3: reg addr MSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * used when reg addr len is set to 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * 4: reg addr LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * used when reg addr len is set to 1 or 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * For the simplify we do not use register addr at all.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * NOTE: As a firmware knows tuner type there is very small possibility
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * there could be some tuner I2C hacks done by firmware and this may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) * lead problems if firmware expects those bytes are used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) * TODO: Here is few hacks. AF9035 chip integrates AF9033 demodulator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * IT9135 chip integrates AF9033 demodulator and RF tuner. For dual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * tuner devices, there is also external AF9033 demodulator connected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * via external I2C bus. All AF9033 demod I2C traffic, both single and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * dual tuner configuration, is covered by firmware - actual USB IO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * looks just like a memory access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) * In case of IT913x chip, there is own tuner driver. It is implemented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * currently as a I2C driver, even tuner IP block is likely build
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * directly into the demodulator memory space and there is no own I2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) * bus. I2C subsystem does not allow register multiple devices to same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) * bus, having same slave address. Due to that we reuse demod address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) * shifted by one bit, on that case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) * For IT930x we use a different command and the sub header is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * different as well:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * 0: data len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * 1: I2C bus (0x03 seems to be only value used)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) * 2: I2C addr << 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #define AF9035_IS_I2C_XFER_WRITE_READ(_msg, _num) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) (_num == 2 && !(_msg[0].flags & I2C_M_RD) && (_msg[1].flags & I2C_M_RD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #define AF9035_IS_I2C_XFER_WRITE(_msg, _num) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) (_num == 1 && !(_msg[0].flags & I2C_M_RD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #define AF9035_IS_I2C_XFER_READ(_msg, _num) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) (_num == 1 && (_msg[0].flags & I2C_M_RD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) if (AF9035_IS_I2C_XFER_WRITE_READ(msg, num)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if (msg[0].len > 40 || msg[1].len > 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* TODO: correct limits > 40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) } else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) (msg[0].addr == state->af9033_i2c_addr[1])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* demod access via firmware interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) msg[0].buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) if (msg[0].addr == state->af9033_i2c_addr[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) reg |= 0x100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) ret = af9035_rd_regs(d, reg, &msg[1].buf[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) msg[1].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) } else if (state->no_read) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) memset(msg[1].buf, 0, msg[1].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /* I2C write + read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) u8 buf[MAX_XFER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) struct usb_req req = { CMD_I2C_RD, 0, 5 + msg[0].len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) buf, msg[1].len, msg[1].buf };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) req.cmd = CMD_GENERIC_I2C_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) req.wlen = 3 + msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) req.mbox |= ((msg[0].addr & 0x80) >> 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) buf[0] = msg[1].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) buf[1] = 0x03; /* I2C bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) buf[2] = msg[0].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) memcpy(&buf[3], msg[0].buf, msg[0].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) buf[1] = msg[0].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) buf[3] = 0x00; /* reg addr MSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) buf[4] = 0x00; /* reg addr LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /* Keep prev behavior for write req len > 2*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) if (msg[0].len > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) buf[2] = 0x00; /* reg addr len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) memcpy(&buf[5], msg[0].buf, msg[0].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) /* Use reg addr fields if write req len <= 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) req.wlen = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) buf[2] = msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) if (msg[0].len == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) buf[3] = msg[0].buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) buf[4] = msg[0].buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) } else if (msg[0].len == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) buf[4] = msg[0].buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) } else if (AF9035_IS_I2C_XFER_WRITE(msg, num)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (msg[0].len > 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) /* TODO: correct limits > 40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) } else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) (msg[0].addr == state->af9033_i2c_addr[1])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) /* demod access via firmware interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) msg[0].buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) if (msg[0].addr == state->af9033_i2c_addr[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) reg |= 0x100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) ret = (msg[0].len >= 3) ? af9035_wr_regs(d, reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) &msg[0].buf[3],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) msg[0].len - 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) : -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) /* I2C write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) u8 buf[MAX_XFER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct usb_req req = { CMD_I2C_WR, 0, 5 + msg[0].len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) buf, 0, NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) req.cmd = CMD_GENERIC_I2C_WR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) req.wlen = 3 + msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) req.mbox |= ((msg[0].addr & 0x80) >> 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) buf[0] = msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) buf[1] = 0x03; /* I2C bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) buf[2] = msg[0].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) memcpy(&buf[3], msg[0].buf, msg[0].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) buf[1] = msg[0].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) buf[2] = 0x00; /* reg addr len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) buf[3] = 0x00; /* reg addr MSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) buf[4] = 0x00; /* reg addr LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) memcpy(&buf[5], msg[0].buf, msg[0].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) } else if (AF9035_IS_I2C_XFER_READ(msg, num)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if (msg[0].len > 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) /* TODO: correct limits > 40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) } else if (state->no_read) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) memset(msg[0].buf, 0, msg[0].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* I2C read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) u8 buf[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) buf, msg[0].len, msg[0].buf };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) req.cmd = CMD_GENERIC_I2C_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) req.wlen = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) req.mbox |= ((msg[0].addr & 0x80) >> 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) buf[0] = msg[0].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) buf[1] = 0x03; /* I2C bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) buf[2] = msg[0].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) buf[1] = msg[0].addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) buf[2] = 0x00; /* reg addr len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) buf[3] = 0x00; /* reg addr MSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) buf[4] = 0x00; /* reg addr LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * We support only three kind of I2C transactions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) * 1) 1 x write + 1 x read (repeated start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) * 2) 1 x write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * 3) 1 x read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) ret = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) mutex_unlock(&d->i2c_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) return num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static u32 af9035_i2c_functionality(struct i2c_adapter *adapter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) return I2C_FUNC_I2C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) static struct i2c_algorithm af9035_i2c_algo = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) .master_xfer = af9035_i2c_master_xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) .functionality = af9035_i2c_functionality,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) int ret, i, ts_mode_invalid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) unsigned int utmp, eeprom_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) u8 wbuf[1] = { 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) u8 rbuf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) sizeof(rbuf), rbuf };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) ret = af9035_rd_regs(d, 0x1222, rbuf, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) state->chip_version = rbuf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) state->chip_type = rbuf[2] << 8 | rbuf[1] << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) ret = af9035_rd_reg(d, 0x384f, &state->prechip_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) dev_info(&intf->dev, "prechip_version=%02x chip_version=%02x chip_type=%04x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) state->prechip_version, state->chip_version, state->chip_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (state->chip_type == 0x9135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) if (state->chip_version == 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) *name = AF9035_FIRMWARE_IT9135_V2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) utmp = 0x00461d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) *name = AF9035_FIRMWARE_IT9135_V1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) utmp = 0x00461b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) /* Check if eeprom exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) ret = af9035_rd_reg(d, utmp, &tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (tmp == 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) dev_dbg(&intf->dev, "no eeprom\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) state->no_eeprom = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) goto check_firmware_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) eeprom_addr = EEPROM_BASE_IT9135;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) } else if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) *name = AF9035_FIRMWARE_IT9303;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) state->no_eeprom = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) goto check_firmware_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) *name = AF9035_FIRMWARE_AF9035;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) eeprom_addr = EEPROM_BASE_AF9035;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /* Read and store eeprom */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) for (i = 0; i < 256; i += 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) ret = af9035_rd_regs(d, eeprom_addr + i, &state->eeprom[i], 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) dev_dbg(&intf->dev, "eeprom dump:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) for (i = 0; i < 256; i += 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) dev_dbg(&intf->dev, "%*ph\n", 16, &state->eeprom[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) /* check for dual tuner mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) tmp = state->eeprom[EEPROM_TS_MODE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) ts_mode_invalid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) switch (tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) state->dual_mode = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) if (state->chip_type != 0x9135 && state->chip_type != 0x9306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) state->dual_mode = true; /* AF9035 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) ts_mode_invalid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) ts_mode_invalid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp, state->dual_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) if (ts_mode_invalid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) dev_info(&intf->dev, "ts mode=%d not supported, defaulting to single tuner mode!", tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) check_firmware_status:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) dev_dbg(&intf->dev, "reply=%*ph\n", 4, rbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) if (rbuf[0] || rbuf[1] || rbuf[2] || rbuf[3])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) ret = WARM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) ret = COLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) return ret;
^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) static int af9035_download_firmware_old(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) int ret, i, j, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) u8 wbuf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) struct usb_req req = { 0, 0, 0, NULL, 0, NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) struct usb_req req_fw_dl = { CMD_FW_DL, 0, 0, wbuf, 0, NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) u8 hdr_core;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) u16 hdr_addr, hdr_data_len, hdr_checksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) #define MAX_DATA 58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) #define HDR_SIZE 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) * Thanks to Daniel Glöckner <daniel-gl@gmx.net> about that info!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) * byte 0: MCS 51 core
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * There are two inside the AF9035 (1=Link and 2=OFDM) with separate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) * address spaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) * byte 1-2: Big endian destination address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) * byte 3-4: Big endian number of data bytes following the header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) * byte 5-6: Big endian header checksum, apparently ignored by the chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) * Calculated as ~(h[0]*256+h[1]+h[2]*256+h[3]+h[4]*256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) for (i = fw->size; i > HDR_SIZE;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) hdr_core = fw->data[fw->size - i + 0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) hdr_addr = fw->data[fw->size - i + 1] << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) hdr_addr |= fw->data[fw->size - i + 2] << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) hdr_data_len = fw->data[fw->size - i + 3] << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) hdr_data_len |= fw->data[fw->size - i + 4] << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) hdr_checksum = fw->data[fw->size - i + 5] << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) hdr_checksum |= fw->data[fw->size - i + 6] << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) dev_dbg(&intf->dev, "core=%d addr=%04x data_len=%d checksum=%04x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) hdr_core, hdr_addr, hdr_data_len, hdr_checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) if (((hdr_core != 1) && (hdr_core != 2)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) (hdr_data_len > i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) dev_dbg(&intf->dev, "bad firmware\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) /* download begin packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) req.cmd = CMD_FW_DL_BEGIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /* download firmware packet(s) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) for (j = HDR_SIZE + hdr_data_len; j > 0; j -= MAX_DATA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) len = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (len > MAX_DATA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) len = MAX_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) req_fw_dl.wlen = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) req_fw_dl.wbuf = (u8 *) &fw->data[fw->size - i +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) HDR_SIZE + hdr_data_len - j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) ret = af9035_ctrl_msg(d, &req_fw_dl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) /* download end packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) req.cmd = CMD_FW_DL_END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) i -= hdr_data_len + HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) dev_dbg(&intf->dev, "data uploaded=%zu\n", fw->size - i);
^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) /* print warn if firmware is bad, continue and see what happens */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) if (i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) dev_warn(&intf->dev, "bad firmware\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) static int af9035_download_firmware_new(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) int ret, i, i_prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct usb_req req_fw_dl = { CMD_FW_SCATTER_WR, 0, 0, NULL, 0, NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) #define HDR_SIZE 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) * There seems to be following firmware header. Meaning of bytes 0-3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) * is unknown.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) * 0: 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) * 1: 0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) * 2: 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) * 3: 1, 2, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) * 4: addr MSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) * 5: addr LSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) * 6: count of data bytes ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) for (i = HDR_SIZE, i_prev = 0; i <= fw->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) if (i == fw->size ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) (fw->data[i + 0] == 0x03 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) (fw->data[i + 1] == 0x00 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) fw->data[i + 1] == 0x01) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) fw->data[i + 2] == 0x00)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) req_fw_dl.wlen = i - i_prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) req_fw_dl.wbuf = (u8 *) &fw->data[i_prev];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) i_prev = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) ret = af9035_ctrl_msg(d, &req_fw_dl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) dev_dbg(&intf->dev, "data uploaded=%d\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) static int af9035_download_firmware(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) u8 wbuf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) u8 rbuf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) struct usb_req req = { 0, 0, 0, NULL, 0, NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) struct usb_req req_fw_ver = { CMD_FW_QUERYINFO, 0, 1, wbuf, 4, rbuf };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) dev_dbg(&intf->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * In case of dual tuner configuration we need to do some extra
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) * initialization in order to download firmware to slave demod too,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) * which is done by master demod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) * Master feeds also clock and controls power via GPIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) if (state->dual_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) /* configure gpioh1, reset & power slave demod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) ret = af9035_wr_reg_mask(d, 0x00d8b1, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) ret = af9035_wr_reg_mask(d, 0x00d8af, 0x00, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) usleep_range(10000, 50000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) ret = af9035_wr_reg_mask(d, 0x00d8af, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) /* tell the slave I2C address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) tmp = state->eeprom[EEPROM_2ND_DEMOD_ADDR];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) /* Use default I2C address if eeprom has no address set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) if (!tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) tmp = 0x1d << 1; /* 8-bit format used by chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if ((state->chip_type == 0x9135) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) (state->chip_type == 0x9306)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) ret = af9035_wr_reg(d, 0x004bfb, tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) ret = af9035_wr_reg(d, 0x00417f, tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) /* enable clock out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) ret = af9035_wr_reg_mask(d, 0x00d81a, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) if (fw->data[0] == 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) ret = af9035_download_firmware_old(d, fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) ret = af9035_download_firmware_new(d, fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) /* firmware loaded, request boot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) req.cmd = CMD_FW_BOOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) /* ensure firmware starts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) wbuf[0] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) ret = af9035_ctrl_msg(d, &req_fw_ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (!(rbuf[0] || rbuf[1] || rbuf[2] || rbuf[3])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) dev_err(&intf->dev, "firmware did not run\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) dev_info(&intf->dev, "firmware version=%d.%d.%d.%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) rbuf[0], rbuf[1], rbuf[2], rbuf[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) return ret;
^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) static int af9035_read_config(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) u16 tmp16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) /* Demod I2C address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) state->af9033_i2c_addr[0] = 0x1c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) state->af9033_i2c_addr[1] = 0x1d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) state->af9033_config[0].adc_multiplier = AF9033_ADC_MULTIPLIER_2X;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) state->af9033_config[1].adc_multiplier = AF9033_ADC_MULTIPLIER_2X;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) state->af9033_config[0].ts_mode = AF9033_TS_MODE_USB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) state->af9033_config[1].ts_mode = AF9033_TS_MODE_SERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) state->it930x_addresses = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) if (state->chip_type == 0x9135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) /* feed clock for integrated RF tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) state->af9033_config[0].dyn0_clk = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) state->af9033_config[1].dyn0_clk = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (state->chip_version == 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) state->af9033_config[0].tuner = AF9033_TUNER_IT9135_60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) state->af9033_config[1].tuner = AF9033_TUNER_IT9135_60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) state->af9033_config[0].tuner = AF9033_TUNER_IT9135_38;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) state->af9033_config[1].tuner = AF9033_TUNER_IT9135_38;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (state->no_eeprom) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) /* Remote controller to NEC polling by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) state->ir_mode = 0x05;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) state->ir_type = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) goto skip_eeprom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) } else if (state->chip_type == 0x9306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) * IT930x is an USB bridge, only single demod-single tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * configurations seen so far.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if ((le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) (le16_to_cpu(d->udev->descriptor.idProduct) == USB_PID_AVERMEDIA_TD310)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) state->it930x_addresses = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) /* Remote controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) state->ir_mode = state->eeprom[EEPROM_IR_MODE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) state->ir_type = state->eeprom[EEPROM_IR_TYPE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) if (state->dual_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) /* Read 2nd demodulator I2C address. 8-bit format on eeprom */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) tmp = state->eeprom[EEPROM_2ND_DEMOD_ADDR];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) if (tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) state->af9033_i2c_addr[1] = tmp >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) dev_dbg(&intf->dev, "2nd demod I2C addr=%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) state->af9033_i2c_addr[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) for (i = 0; i < state->dual_mode + 1; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) unsigned int eeprom_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) /* tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) tmp = state->eeprom[EEPROM_1_TUNER_ID + eeprom_offset];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) dev_dbg(&intf->dev, "[%d]tuner=%02x\n", i, tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) /* tuner sanity check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) if (state->chip_type == 0x9135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) if (state->chip_version == 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) /* IT9135 BX (v2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) switch (tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) case AF9033_TUNER_IT9135_60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) case AF9033_TUNER_IT9135_61:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) case AF9033_TUNER_IT9135_62:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) state->af9033_config[i].tuner = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) /* IT9135 AX (v1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) switch (tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) case AF9033_TUNER_IT9135_38:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) case AF9033_TUNER_IT9135_51:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) case AF9033_TUNER_IT9135_52:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) state->af9033_config[i].tuner = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) /* AF9035 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) state->af9033_config[i].tuner = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (state->af9033_config[i].tuner != tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) dev_info(&intf->dev, "[%d] overriding tuner from %02x to %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) i, tmp, state->af9033_config[i].tuner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) switch (state->af9033_config[i].tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) case AF9033_TUNER_TUA9001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) case AF9033_TUNER_FC0011:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) case AF9033_TUNER_MXL5007T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) case AF9033_TUNER_TDA18218:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) case AF9033_TUNER_FC2580:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) case AF9033_TUNER_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) state->af9033_config[i].spec_inv = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) case AF9033_TUNER_IT9135_38:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) case AF9033_TUNER_IT9135_51:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) case AF9033_TUNER_IT9135_52:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) case AF9033_TUNER_IT9135_60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) case AF9033_TUNER_IT9135_61:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) case AF9033_TUNER_IT9135_62:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) dev_warn(&intf->dev, "tuner id=%02x not supported, please report!",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) /* disable dual mode if driver does not support it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) if (i == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) switch (state->af9033_config[i].tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) case AF9033_TUNER_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) case AF9033_TUNER_IT9135_38:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) case AF9033_TUNER_IT9135_51:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) case AF9033_TUNER_IT9135_52:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) case AF9033_TUNER_IT9135_60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) case AF9033_TUNER_IT9135_61:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) case AF9033_TUNER_IT9135_62:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) case AF9033_TUNER_MXL5007T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) state->dual_mode = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) dev_info(&intf->dev, "driver does not support 2nd tuner and will disable it");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) /* tuner IF frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) tmp = state->eeprom[EEPROM_1_IF_L + eeprom_offset];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) tmp16 = tmp << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) tmp = state->eeprom[EEPROM_1_IF_H + eeprom_offset];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) tmp16 |= tmp << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) dev_dbg(&intf->dev, "[%d]IF=%d\n", i, tmp16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) eeprom_offset += 0x10; /* shift for the 2nd tuner params */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) skip_eeprom:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) /* get demod clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) ret = af9035_rd_reg(d, 0x00d800, &tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) tmp = (tmp >> 0) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) for (i = 0; i < ARRAY_SIZE(state->af9033_config); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) if (state->chip_type == 0x9135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) state->af9033_config[i].clock = clock_lut_it9135[tmp];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) state->af9033_config[i].clock = clock_lut_af9035[tmp];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) state->no_read = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) /* Some MXL5007T devices cannot properly handle tuner I2C read ops. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) if (state->af9033_config[0].tuner == AF9033_TUNER_MXL5007T &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) case USB_PID_AVERMEDIA_A867:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) case USB_PID_AVERMEDIA_TWINSTAR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) dev_info(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) "Device may have issues with I2C read operations. Enabling fix.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) state->no_read = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) static int af9035_tua9001_tuner_callback(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) int cmd, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) dev_dbg(&intf->dev, "cmd=%d arg=%d\n", cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) * CEN always enabled by hardware wiring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) * RESETN GPIOT3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) * RXEN GPIOT2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) case TUA9001_CMD_RESETN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) if (arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) val = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) val = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) ret = af9035_wr_reg_mask(d, 0x00d8e7, val, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) case TUA9001_CMD_RXEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) if (arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) val = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) val = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) ret = af9035_wr_reg_mask(d, 0x00d8eb, val, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) }
^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) static int af9035_fc0011_tuner_callback(struct dvb_usb_device *d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) int cmd, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) case FC0011_FE_CALLBACK_POWER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) /* Tuner enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) ret = af9035_wr_reg_mask(d, 0xd8eb, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) ret = af9035_wr_reg_mask(d, 0xd8ec, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) ret = af9035_wr_reg_mask(d, 0xd8ed, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) /* LED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) ret = af9035_wr_reg_mask(d, 0xd8d0, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) ret = af9035_wr_reg_mask(d, 0xd8d1, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) usleep_range(10000, 50000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) case FC0011_FE_CALLBACK_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) ret = af9035_wr_reg(d, 0xd8e9, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) ret = af9035_wr_reg(d, 0xd8e8, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) ret = af9035_wr_reg(d, 0xd8e7, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) usleep_range(10000, 20000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) ret = af9035_wr_reg(d, 0xd8e7, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) usleep_range(10000, 20000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) static int af9035_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) switch (state->af9033_config[0].tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) case AF9033_TUNER_FC0011:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) return af9035_fc0011_tuner_callback(d, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) case AF9033_TUNER_TUA9001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) return af9035_tua9001_tuner_callback(d, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) static int af9035_frontend_callback(void *adapter_priv, int component,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) int cmd, int arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) struct i2c_adapter *adap = adapter_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) struct dvb_usb_device *d = i2c_get_adapdata(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) dev_dbg(&intf->dev, "component=%d cmd=%d arg=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) component, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) switch (component) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) case DVB_FRONTEND_COMPONENT_TUNER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) return af9035_tuner_callback(d, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) static int af9035_get_adapter_count(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) return state->dual_mode + 1;
^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) static int af9035_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) if (!state->af9033_config[adap->id].tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) /* unsupported tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) state->af9033_config[adap->id].fe = &adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) state->af9033_config[adap->id].ops = &state->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) ret = af9035_add_i2c_dev(d, "af9033", state->af9033_i2c_addr[adap->id],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) &state->af9033_config[adap->id], &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) if (adap->fe[0] == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) /* disable I2C-gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) adap->fe[0]->ops.i2c_gate_ctrl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) adap->fe[0]->callback = af9035_frontend_callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) * The I2C speed register is calculated with:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) * I2C speed register = (1000000000 / (24.4 * 16 * I2C_speed))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) * The default speed register for it930x is 7, with means a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) * speed of ~366 kbps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) #define I2C_SPEED_366K 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) static int it930x_frontend_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) struct si2168_config si2168_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) struct i2c_adapter *adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) /* I2C master bus 2 clock speed 366k */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) ret = af9035_wr_reg(d, 0x00f6a7, I2C_SPEED_366K);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) /* I2C master bus 1,3 clock speed 366k */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) ret = af9035_wr_reg(d, 0x00f103, I2C_SPEED_366K);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) /* set gpio11 low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) ret = af9035_wr_reg_mask(d, 0xd8d4, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) ret = af9035_wr_reg_mask(d, 0xd8d5, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) ret = af9035_wr_reg_mask(d, 0xd8d3, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) /* Tuner enable using gpiot2_en, gpiot2_on and gpiot2_o (reset) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) ret = af9035_wr_reg_mask(d, 0xd8b8, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) ret = af9035_wr_reg_mask(d, 0xd8b9, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) ret = af9035_wr_reg_mask(d, 0xd8b7, 0x00, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) ret = af9035_wr_reg_mask(d, 0xd8b7, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) memset(&si2168_config, 0, sizeof(si2168_config));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) si2168_config.i2c_adapter = &adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) si2168_config.fe = &adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) si2168_config.ts_mode = SI2168_TS_SERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) state->af9033_config[adap->id].fe = &adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) state->af9033_config[adap->id].ops = &state->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) ret = af9035_add_i2c_dev(d, "si2168",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) it930x_addresses_table[state->it930x_addresses].frontend_i2c_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) &si2168_config, &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) if (adap->fe[0] == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) ret = -ENODEV;
^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) state->i2c_adapter_demod = adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) static int af9035_frontend_detach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) if (adap->id == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) if (state->i2c_client[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) af9035_del_i2c_dev(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) } else if (adap->id == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) if (state->i2c_client[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) af9035_del_i2c_dev(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) static const struct fc0011_config af9035_fc0011_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) .i2c_address = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) static struct mxl5007t_config af9035_mxl5007t_config[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) .xtal_freq_hz = MxL_XTAL_24_MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) .if_freq_hz = MxL_IF_4_57_MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) .invert_if = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) .loop_thru_enable = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) .clk_out_enable = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) .clk_out_amp = MxL_CLKOUT_AMP_0_94V,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) .xtal_freq_hz = MxL_XTAL_24_MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) .if_freq_hz = MxL_IF_4_57_MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) .invert_if = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) .loop_thru_enable = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) .clk_out_enable = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) .clk_out_amp = MxL_CLKOUT_AMP_0_94V,
^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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) static struct tda18218_config af9035_tda18218_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) .i2c_address = 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) .i2c_wr_max = 21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) static const struct fc0012_config af9035_fc0012_config[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) .i2c_address = 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) .xtal_freq = FC_XTAL_36_MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) .dual_master = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) .loop_through = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) .clock_out = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) .i2c_address = 0x63 | 0x80, /* I2C bus select hack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) .xtal_freq = FC_XTAL_36_MHZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) .dual_master = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) struct i2c_msg msg[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) u8 tuner_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) * XXX: Hack used in that function: we abuse unused I2C address bit [7]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) * to carry info about used I2C bus for dual tuner configuration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) switch (state->af9033_config[adap->id].tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) case AF9033_TUNER_TUA9001: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) struct tua9001_platform_data tua9001_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) .dvb_frontend = adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) * AF9035 gpiot3 = TUA9001 RESETN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * AF9035 gpiot2 = TUA9001 RXEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) /* configure gpiot2 and gpiot2 as output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) ret = af9035_wr_reg_mask(d, 0x00d8ec, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) ret = af9035_wr_reg_mask(d, 0x00d8ed, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) ret = af9035_wr_reg_mask(d, 0x00d8e8, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) ret = af9035_wr_reg_mask(d, 0x00d8e9, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) /* attach tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) ret = af9035_add_i2c_dev(d, "tua9001", 0x60, &tua9001_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) fe = adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) case AF9033_TUNER_FC0011:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) fe = dvb_attach(fc0011_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) &d->i2c_adap, &af9035_fc0011_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) case AF9033_TUNER_MXL5007T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) if (adap->id == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) ret = af9035_wr_reg(d, 0x00d8e0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) ret = af9035_wr_reg(d, 0x00d8e1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) ret = af9035_wr_reg(d, 0x00d8df, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) msleep(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) ret = af9035_wr_reg(d, 0x00d8df, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) msleep(300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) ret = af9035_wr_reg(d, 0x00d8c0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) ret = af9035_wr_reg(d, 0x00d8c1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) ret = af9035_wr_reg(d, 0x00d8bf, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) ret = af9035_wr_reg(d, 0x00d8b4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) ret = af9035_wr_reg(d, 0x00d8b5, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) if (ret < 0)
^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) ret = af9035_wr_reg(d, 0x00d8b3, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) tuner_addr = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) tuner_addr = 0x60 | 0x80; /* I2C bus hack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) /* attach tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) fe = dvb_attach(mxl5007t_attach, adap->fe[0], &d->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) tuner_addr, &af9035_mxl5007t_config[adap->id]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) case AF9033_TUNER_TDA18218:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) /* attach tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) fe = dvb_attach(tda18218_attach, adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) &d->i2c_adap, &af9035_tda18218_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) case AF9033_TUNER_FC2580: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) struct fc2580_platform_data fc2580_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) .dvb_frontend = adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) /* Tuner enable using gpiot2_o, gpiot2_en and gpiot2_on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) ret = af9035_wr_reg_mask(d, 0xd8eb, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) if (ret < 0)
^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) ret = af9035_wr_reg_mask(d, 0xd8ec, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) ret = af9035_wr_reg_mask(d, 0xd8ed, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) usleep_range(10000, 50000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) /* attach tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) ret = af9035_add_i2c_dev(d, "fc2580", 0x56, &fc2580_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) &d->i2c_adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) fe = adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) case AF9033_TUNER_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) * AF9035 gpiot2 = FC0012 enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) * XXX: there seems to be something on gpioh8 too, but on my
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) * my test I didn't find any difference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) if (adap->id == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) /* configure gpiot2 as output and high */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) ret = af9035_wr_reg_mask(d, 0xd8eb, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) if (ret < 0)
^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) ret = af9035_wr_reg_mask(d, 0xd8ec, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) ret = af9035_wr_reg_mask(d, 0xd8ed, 0x01, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) * FIXME: That belongs for the FC0012 driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) * Write 02 to FC0012 master tuner register 0d directly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) * in order to make slave tuner working.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) msg[0].addr = 0x63;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) msg[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) msg[0].len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) msg[0].buf = "\x0d\x02";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) ret = i2c_transfer(&d->i2c_adap, msg, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) usleep_range(10000, 50000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) fe = dvb_attach(fc0012_attach, adap->fe[0], &d->i2c_adap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) &af9035_fc0012_config[adap->id]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) case AF9033_TUNER_IT9135_38:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) case AF9033_TUNER_IT9135_51:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) case AF9033_TUNER_IT9135_52:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) case AF9033_TUNER_IT9135_60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) case AF9033_TUNER_IT9135_61:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) case AF9033_TUNER_IT9135_62:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) struct it913x_platform_data it913x_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) .regmap = state->af9033_config[adap->id].regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) .fe = adap->fe[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) switch (state->af9033_config[adap->id].tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) case AF9033_TUNER_IT9135_38:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) case AF9033_TUNER_IT9135_51:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) case AF9033_TUNER_IT9135_52:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) name = "it9133ax-tuner";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) case AF9033_TUNER_IT9135_60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) case AF9033_TUNER_IT9135_61:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) case AF9033_TUNER_IT9135_62:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) name = "it9133bx-tuner";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) if (state->dual_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) if (adap->id == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) it913x_pdata.role = IT913X_ROLE_DUAL_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) it913x_pdata.role = IT913X_ROLE_DUAL_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) it913x_pdata.role = IT913X_ROLE_SINGLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) request_module("%s", "it913x");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) pdev = platform_device_register_data(&d->intf->dev, name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) PLATFORM_DEVID_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) &it913x_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) sizeof(it913x_pdata));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) if (IS_ERR(pdev) || !pdev->dev.driver) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) if (!try_module_get(pdev->dev.driver->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) platform_device_unregister(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) state->platform_device_tuner[adap->id] = pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) fe = adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) fe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) if (fe == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) static int it930x_tuner_attach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) struct si2157_config si2157_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) memset(&si2157_config, 0, sizeof(si2157_config));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) si2157_config.fe = adap->fe[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) * HACK: The Logilink VG0022A and TerraTec TC2 Stick have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) * a bug: when the si2157 firmware that came with the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) * is replaced by a new one, the I2C transfers to the tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) * will return just 0xff.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) * Probably, the vendor firmware has some patch specifically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) * designed for this device. So, we can't replace by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) * generic firmware. The right solution would be to extract
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) * the si2157 firmware from the original driver and ask the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) * driver to load the specifically designed firmware, but,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) * while we don't have that, the next best solution is to just
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) * keep the original firmware at the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) if ((le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_DEXATEK &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) le16_to_cpu(d->udev->descriptor.idProduct) == 0x0100) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_TERRATEC &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) le16_to_cpu(d->udev->descriptor.idProduct) == USB_PID_TERRATEC_CINERGY_TC2_STICK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) si2157_config.dont_load_firmware = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) si2157_config.if_port = it930x_addresses_table[state->it930x_addresses].tuner_if_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) ret = af9035_add_i2c_dev(d, "si2157",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) it930x_addresses_table[state->it930x_addresses].tuner_i2c_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) &si2157_config, state->i2c_adapter_demod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) static int it930x_tuner_detach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) if (adap->id == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) if (state->i2c_client[3])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) af9035_del_i2c_dev(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) } else if (adap->id == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) if (state->i2c_client[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) af9035_del_i2c_dev(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) static int af9035_tuner_detach(struct dvb_usb_adapter *adap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) struct dvb_usb_device *d = adap_to_d(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) switch (state->af9033_config[adap->id].tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) case AF9033_TUNER_TUA9001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) case AF9033_TUNER_FC2580:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) if (adap->id == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) if (state->i2c_client[3])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) af9035_del_i2c_dev(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) } else if (adap->id == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) if (state->i2c_client[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) af9035_del_i2c_dev(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) case AF9033_TUNER_IT9135_38:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) case AF9033_TUNER_IT9135_51:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) case AF9033_TUNER_IT9135_52:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) case AF9033_TUNER_IT9135_60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) case AF9033_TUNER_IT9135_61:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) case AF9033_TUNER_IT9135_62:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) pdev = state->platform_device_tuner[adap->id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) if (pdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) module_put(pdev->dev.driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) platform_device_unregister(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) static int af9035_init(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) u16 frame_size = (d->udev->speed == USB_SPEED_FULL ? 5 : 87) * 188 / 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) u8 packet_size = (d->udev->speed == USB_SPEED_FULL ? 64 : 512) / 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) struct reg_val_mask tab[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) { 0x80f99d, 0x01, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) { 0x80f9a4, 0x01, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) { 0x00dd11, 0x00, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) { 0x00dd11, 0x00, 0x40 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) { 0x00dd13, 0x00, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) { 0x00dd13, 0x00, 0x40 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) { 0x00dd11, 0x20, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) { 0x00dd88, (frame_size >> 0) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) { 0x00dd89, (frame_size >> 8) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) { 0x00dd0c, packet_size, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) { 0x00dd11, state->dual_mode << 6, 0x40 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) { 0x00dd8a, (frame_size >> 0) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) { 0x00dd8b, (frame_size >> 8) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) { 0x00dd0d, packet_size, 0xff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) { 0x80f9a3, state->dual_mode, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) { 0x80f9cd, state->dual_mode, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) { 0x80f99d, 0x00, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) { 0x80f9a4, 0x00, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) dev_dbg(&intf->dev, "USB speed=%d frame_size=%04x packet_size=%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) d->udev->speed, frame_size, packet_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) /* init endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) for (i = 0; i < ARRAY_SIZE(tab); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) ret = af9035_wr_reg_mask(d, tab[i].reg, tab[i].val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) tab[i].mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) static int it930x_init(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) u16 frame_size = (d->udev->speed == USB_SPEED_FULL ? 5 : 816) * 188 / 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) u8 packet_size = (d->udev->speed == USB_SPEED_FULL ? 64 : 512) / 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) struct reg_val_mask tab[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) { 0x00da1a, 0x00, 0x01 }, /* ignore_sync_byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) { 0x00f41f, 0x04, 0x04 }, /* dvbt_inten */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) { 0x00da10, 0x00, 0x01 }, /* mpeg_full_speed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) { 0x00f41a, 0x01, 0x01 }, /* dvbt_en */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) { 0x00da1d, 0x01, 0x01 }, /* mp2_sw_rst, reset EP4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) { 0x00dd11, 0x00, 0x20 }, /* ep4_tx_en, disable EP4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) { 0x00dd13, 0x00, 0x20 }, /* ep4_tx_nak, disable EP4 NAK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) { 0x00dd11, 0x20, 0x20 }, /* ep4_tx_en, enable EP4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) { 0x00dd11, 0x00, 0x40 }, /* ep5_tx_en, disable EP5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) { 0x00dd13, 0x00, 0x40 }, /* ep5_tx_nak, disable EP5 NAK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) { 0x00dd11, state->dual_mode << 6, 0x40 }, /* enable EP5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) { 0x00dd88, (frame_size >> 0) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) { 0x00dd89, (frame_size >> 8) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) { 0x00dd0c, packet_size, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) { 0x00dd8a, (frame_size >> 0) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) { 0x00dd8b, (frame_size >> 8) & 0xff, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) { 0x00dd0d, packet_size, 0xff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) { 0x00da1d, 0x00, 0x01 }, /* mp2_sw_rst, disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) { 0x00d833, 0x01, 0xff }, /* slew rate ctrl: slew rate boosts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) { 0x00d830, 0x00, 0xff }, /* Bit 0 of output driving control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) { 0x00d831, 0x01, 0xff }, /* Bit 1 of output driving control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) { 0x00d832, 0x00, 0xff }, /* Bit 2 of output driving control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) /* suspend gpio1 for TS-C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) { 0x00d8b0, 0x01, 0xff }, /* gpio1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) { 0x00d8b1, 0x01, 0xff }, /* gpio1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) { 0x00d8af, 0x00, 0xff }, /* gpio1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) /* suspend gpio7 for TS-D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) { 0x00d8c4, 0x01, 0xff }, /* gpio7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) { 0x00d8c5, 0x01, 0xff }, /* gpio7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) { 0x00d8c3, 0x00, 0xff }, /* gpio7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) /* suspend gpio13 for TS-B */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) { 0x00d8dc, 0x01, 0xff }, /* gpio13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) { 0x00d8dd, 0x01, 0xff }, /* gpio13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) { 0x00d8db, 0x00, 0xff }, /* gpio13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) /* suspend gpio14 for TS-E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) { 0x00d8e4, 0x01, 0xff }, /* gpio14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) { 0x00d8e5, 0x01, 0xff }, /* gpio14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) { 0x00d8e3, 0x00, 0xff }, /* gpio14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) /* suspend gpio15 for TS-A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) { 0x00d8e8, 0x01, 0xff }, /* gpio15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) { 0x00d8e9, 0x01, 0xff }, /* gpio15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) { 0x00d8e7, 0x00, 0xff }, /* gpio15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) { 0x00da58, 0x00, 0x01 }, /* ts_in_src, serial */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) { 0x00da73, 0x01, 0xff }, /* ts0_aggre_mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) { 0x00da78, 0x47, 0xff }, /* ts0_sync_byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) { 0x00da4c, 0x01, 0xff }, /* ts0_en */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) { 0x00da5a, 0x1f, 0xff }, /* ts_fail_ignore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) dev_dbg(&intf->dev, "USB speed=%d frame_size=%04x packet_size=%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) d->udev->speed, frame_size, packet_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) /* init endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) for (i = 0; i < ARRAY_SIZE(tab); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) ret = af9035_wr_reg_mask(d, tab[i].reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) tab[i].val, tab[i].mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) #if IS_ENABLED(CONFIG_RC_CORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) static int af9035_rc_query(struct dvb_usb_device *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) enum rc_proto proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) u32 key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) u8 buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) struct usb_req req = { CMD_IR_GET, 0, 0, NULL, 4, buf };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) ret = af9035_ctrl_msg(d, &req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) if (ret == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) else if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) if ((buf[2] + buf[3]) == 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) if ((buf[0] + buf[1]) == 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) /* NEC standard 16bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) key = RC_SCANCODE_NEC(buf[0], buf[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) proto = RC_PROTO_NEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) /* NEC extended 24bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) key = RC_SCANCODE_NECX(buf[0] << 8 | buf[1], buf[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) proto = RC_PROTO_NECX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) /* NEC full code 32bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) key = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) buf[2] << 8 | buf[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) proto = RC_PROTO_NEC32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) dev_dbg(&intf->dev, "%*ph\n", 4, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) rc_keydown(d->rc_dev, proto, key, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) dev_dbg(&intf->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) static int af9035_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) struct state *state = d_to_priv(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) dev_dbg(&intf->dev, "ir_mode=%02x ir_type=%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) state->ir_mode, state->ir_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) /* don't activate rc if in HID mode or if not available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) if (state->ir_mode == 0x05) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) switch (state->ir_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) case 0: /* NEC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) rc->allowed_protos = RC_PROTO_BIT_NEC |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) RC_PROTO_BIT_NECX | RC_PROTO_BIT_NEC32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) case 1: /* RC6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) rc->allowed_protos = RC_PROTO_BIT_RC6_MCE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) rc->query = af9035_rc_query;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) rc->interval = 500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) /* load empty to enable rc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) if (!rc->map_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) rc->map_name = RC_MAP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) #define af9035_get_rc_config NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) static int af9035_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) struct usb_data_stream_properties *stream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) struct dvb_usb_device *d = fe_to_d(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) struct usb_interface *intf = d->intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) dev_dbg(&intf->dev, "adap=%d\n", fe_to_adap(fe)->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) if (d->udev->speed == USB_SPEED_FULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) stream->u.bulk.buffersize = 5 * 188;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) static int af9035_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) return state->ops.pid_filter_ctrl(adap->fe[0], onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) static int af9035_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) struct state *state = adap_to_priv(adap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) return state->ops.pid_filter(adap->fe[0], index, pid, onoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) static int af9035_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) struct usb_device *udev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) char manufacturer[sizeof("Afatech")];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) memset(manufacturer, 0, sizeof(manufacturer));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) usb_string(udev, udev->descriptor.iManufacturer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) manufacturer, sizeof(manufacturer));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) * There is two devices having same ID but different chipset. One uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) * AF9015 and the other IT9135 chipset. Only difference seen on lsusb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) * is iManufacturer string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) * idVendor 0x0ccd TerraTec Electronic GmbH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) * idProduct 0x0099
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) * bcdDevice 2.00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) * iManufacturer 1 Afatech
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) * iProduct 2 DVB-T 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) * idVendor 0x0ccd TerraTec Electronic GmbH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) * idProduct 0x0099
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) * bcdDevice 2.00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) * iManufacturer 1 ITE Technologies, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) * iProduct 2 DVB-T TV Stick
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) if ((le16_to_cpu(udev->descriptor.idVendor) == USB_VID_TERRATEC) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) (le16_to_cpu(udev->descriptor.idProduct) == 0x0099)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) if (!strcmp("Afatech", manufacturer)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) dev_dbg(&udev->dev, "rejecting device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) return dvb_usbv2_probe(intf, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) /* interface 0 is used by DVB-T receiver and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) interface 1 is for remote controller (HID) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) static const struct dvb_usb_device_properties af9035_props = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) .driver_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) .adapter_nr = adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) .size_of_priv = sizeof(struct state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) .generic_bulk_ctrl_endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) .generic_bulk_ctrl_endpoint_response = 0x81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) .identify_state = af9035_identify_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) .download_firmware = af9035_download_firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) .i2c_algo = &af9035_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) .read_config = af9035_read_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) .frontend_attach = af9035_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) .frontend_detach = af9035_frontend_detach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) .tuner_attach = af9035_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) .tuner_detach = af9035_tuner_detach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) .init = af9035_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) .get_rc_config = af9035_get_rc_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) .get_stream_config = af9035_get_stream_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) .get_adapter_count = af9035_get_adapter_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) .caps = DVB_USB_ADAP_HAS_PID_FILTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) .pid_filter_count = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) .pid_filter_ctrl = af9035_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) .pid_filter = af9035_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) .stream = DVB_USB_STREAM_BULK(0x84, 6, 87 * 188),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) .caps = DVB_USB_ADAP_HAS_PID_FILTER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) .pid_filter_count = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) .pid_filter_ctrl = af9035_pid_filter_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) .pid_filter = af9035_pid_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) .stream = DVB_USB_STREAM_BULK(0x85, 6, 87 * 188),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) static const struct dvb_usb_device_properties it930x_props = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) .driver_name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) .adapter_nr = adapter_nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) .size_of_priv = sizeof(struct state),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) .generic_bulk_ctrl_endpoint = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) .generic_bulk_ctrl_endpoint_response = 0x81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) .identify_state = af9035_identify_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) .download_firmware = af9035_download_firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) .i2c_algo = &af9035_i2c_algo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) .read_config = af9035_read_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) .frontend_attach = it930x_frontend_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) .frontend_detach = af9035_frontend_detach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) .tuner_attach = it930x_tuner_attach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) .tuner_detach = it930x_tuner_detach,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) .init = it930x_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) .get_stream_config = af9035_get_stream_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) .get_adapter_count = af9035_get_adapter_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) .adapter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) .stream = DVB_USB_STREAM_BULK(0x84, 4, 816 * 188),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) .stream = DVB_USB_STREAM_BULK(0x85, 4, 816 * 188),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) static const struct usb_device_id af9035_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) /* AF9035 devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9035_9035,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) &af9035_props, "Afatech AF9035 reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9035_1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) &af9035_props, "Afatech AF9035 reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9035_1001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) &af9035_props, "Afatech AF9035 reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9035_1002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) &af9035_props, "Afatech AF9035 reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9035_1003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) &af9035_props, "Afatech AF9035 reference design", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) &af9035_props, "TerraTec Cinergy T Stick", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A835,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) &af9035_props, "AVerMedia AVerTV Volar HD/PRO (A835)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_B835,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) &af9035_props, "AVerMedia AVerTV Volar HD/PRO (A835)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_1867,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) &af9035_props, "AVerMedia HD Volar (A867)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A867,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) &af9035_props, "AVerMedia HD Volar (A867)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_TWINSTAR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) &af9035_props, "AVerMedia Twinstar (A825)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) { DVB_USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100MINI_PLUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) &af9035_props, "Asus U3100Mini Plus", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00aa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) &af9035_props, "TerraTec Cinergy T Stick (rev. 2)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, 0x0337,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) &af9035_props, "AVerMedia HD Volar (A867)", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_EVOLVEO_XTRATV_STICK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) &af9035_props, "EVOLVEO XtraTV stick", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) /* IT9135 devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) { DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) &af9035_props, "ITE 9135 Generic", RC_MAP_IT913X_V1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) { DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135_9005,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) &af9035_props, "ITE 9135(9005) Generic", RC_MAP_IT913X_V2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) { DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135_9006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) &af9035_props, "ITE 9135(9006) Generic", RC_MAP_IT913X_V1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A835B_1835,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) &af9035_props, "Avermedia A835B(1835)", RC_MAP_IT913X_V2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A835B_2835,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) &af9035_props, "Avermedia A835B(2835)", RC_MAP_IT913X_V2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A835B_3835,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) &af9035_props, "Avermedia A835B(3835)", RC_MAP_IT913X_V2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A835B_4835,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) &af9035_props, "Avermedia A835B(4835)", RC_MAP_IT913X_V2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_TD110,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) &af9035_props, "Avermedia AverTV Volar HD 2 (TD110)", RC_MAP_AVERMEDIA_RM_KS) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_H335,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) &af9035_props, "Avermedia H335", RC_MAP_IT913X_V2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB499_2T_T09,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) &af9035_props, "Kworld UB499-2T T09", RC_MAP_IT913X_V1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22_IT9137,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) &af9035_props, "Sveon STV22 Dual DVB-T HDTV",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) RC_MAP_IT913X_V1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CTVDIGDUAL_V2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) &af9035_props, "Digital Dual TV Receiver CTVDIGDUAL_V2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) RC_MAP_IT913X_V1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) &af9035_props, "TerraTec T1", RC_MAP_IT913X_V1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) /* XXX: that same ID [0ccd:0099] is used by af9015 driver too */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x0099,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) &af9035_props, "TerraTec Cinergy T Stick Dual RC (rev. 2)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) &af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xf900,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) &af9035_props, "Hauppauge WinTV-MiniStick 2", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) { DVB_USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_78E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) &af9035_props, "PCTV AndroiDTV (78e)", RC_MAP_IT913X_V1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) { DVB_USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_79E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) &af9035_props, "PCTV microStick (79e)", RC_MAP_IT913X_V2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) /* IT930x devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) { DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9303,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) &it930x_props, "ITE 9303 Generic", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_TD310,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) &it930x_props, "AVerMedia TD310 DVB-T2", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x0100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) &it930x_props, "Logilink VG0022A", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_TC2_STICK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) &it930x_props, "TerraTec Cinergy TC2 Stick", NULL) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) MODULE_DEVICE_TABLE(usb, af9035_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) static struct usb_driver af9035_usb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) .name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) .id_table = af9035_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) .probe = af9035_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) .disconnect = dvb_usbv2_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) .suspend = dvb_usbv2_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) .resume = dvb_usbv2_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) .reset_resume = dvb_usbv2_reset_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) .no_dynamic_id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) .soft_unbind = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) module_usb_driver(af9035_usb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) MODULE_DESCRIPTION("Afatech AF9035 driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) MODULE_FIRMWARE(AF9035_FIRMWARE_AF9035);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) MODULE_FIRMWARE(AF9035_FIRMWARE_IT9135_V1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) MODULE_FIRMWARE(AF9035_FIRMWARE_IT9135_V2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) MODULE_FIRMWARE(AF9035_FIRMWARE_IT9303);