blob: 2fa7c6ee5a7019ec9498f5a0efbdbd44469a08ec [file] [log] [blame]
Antti Palosaari80619de2008-09-15 17:18:09 -03001/*
2 * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
3 *
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5 *
6 * Thanks to Afatech who kindly provided information.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 */
23
24#include "af9015.h"
Antti Palosaari80619de2008-09-15 17:18:09 -030025
Antti Palosaari349d0422008-11-05 16:31:24 -030026static int dvb_usb_af9015_remote;
Antti Palosaari80619de2008-09-15 17:18:09 -030027module_param_named(remote, dvb_usb_af9015_remote, int, 0644);
28MODULE_PARM_DESC(remote, "select remote");
Antti Palosaari80619de2008-09-15 17:18:09 -030029DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
30
Antti Palosaaria3645e52012-06-07 20:36:35 -030031static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req)
Antti Palosaari80619de2008-09-15 17:18:09 -030032{
Antti Palosaari06565d72009-09-12 20:46:30 -030033#define REQ_HDR_LEN 8 /* send header size */
34#define ACK_HDR_LEN 2 /* rece header size */
Antti Palosaarie8089662012-06-16 18:13:06 -030035 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -030036 int ret, wlen, rlen;
Antti Palosaari80619de2008-09-15 17:18:09 -030037 u8 write = 1;
Antti Palosaari80619de2008-09-15 17:18:09 -030038
Antti Palosaariaff8c2d2013-02-26 13:25:19 -030039 mutex_lock(&d->usb_mutex);
40
41 state->buf[0] = req->cmd;
42 state->buf[1] = state->seq++;
43 state->buf[2] = req->i2c_addr;
44 state->buf[3] = req->addr >> 8;
45 state->buf[4] = req->addr & 0xff;
46 state->buf[5] = req->mbox;
47 state->buf[6] = req->addr_len;
48 state->buf[7] = req->data_len;
Antti Palosaari80619de2008-09-15 17:18:09 -030049
50 switch (req->cmd) {
51 case GET_CONFIG:
Antti Palosaari80619de2008-09-15 17:18:09 -030052 case READ_MEMORY:
53 case RECONNECT_USB:
Antti Palosaari80619de2008-09-15 17:18:09 -030054 write = 0;
55 break;
56 case READ_I2C:
57 write = 0;
Antti Palosaariaff8c2d2013-02-26 13:25:19 -030058 state->buf[2] |= 0x01; /* set I2C direction */
Antti Palosaari80619de2008-09-15 17:18:09 -030059 case WRITE_I2C:
Antti Palosaariaff8c2d2013-02-26 13:25:19 -030060 state->buf[0] = READ_WRITE_I2C;
Antti Palosaari80619de2008-09-15 17:18:09 -030061 break;
62 case WRITE_MEMORY:
63 if (((req->addr & 0xff00) == 0xff00) ||
Antti Palosaarif4e96de2009-09-12 21:25:59 -030064 ((req->addr & 0xff00) == 0xae00))
Antti Palosaariaff8c2d2013-02-26 13:25:19 -030065 state->buf[0] = WRITE_VIRTUAL_MEMORY;
Antti Palosaari80619de2008-09-15 17:18:09 -030066 case WRITE_VIRTUAL_MEMORY:
67 case COPY_FIRMWARE:
68 case DOWNLOAD_FIRMWARE:
Nils Kassubeba1bc642009-07-28 11:54:52 -030069 case BOOT:
Antti Palosaari80619de2008-09-15 17:18:09 -030070 break;
71 default:
Antti Palosaarif2247492012-09-12 20:23:50 -030072 dev_err(&d->udev->dev, "%s: unknown command=%d\n",
73 KBUILD_MODNAME, req->cmd);
Antti Palosaarie1e9e512012-09-12 20:23:52 -030074 ret = -EIO;
Antti Palosaaria3645e52012-06-07 20:36:35 -030075 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -030076 }
77
Antti Palosaari06565d72009-09-12 20:46:30 -030078 /* buffer overflow check */
79 if ((write && (req->data_len > BUF_LEN - REQ_HDR_LEN)) ||
Antti Palosaarif2247492012-09-12 20:23:50 -030080 (!write && (req->data_len > BUF_LEN - ACK_HDR_LEN))) {
81 dev_err(&d->udev->dev, "%s: too much data; cmd=%d len=%d\n",
82 KBUILD_MODNAME, req->cmd, req->data_len);
Antti Palosaari06565d72009-09-12 20:46:30 -030083 ret = -EINVAL;
Antti Palosaaria3645e52012-06-07 20:36:35 -030084 goto error;
Antti Palosaari06565d72009-09-12 20:46:30 -030085 }
86
Antti Palosaari06565d72009-09-12 20:46:30 -030087 /* write receives seq + status = 2 bytes
88 read receives seq + status + data = 2 + N bytes */
Antti Palosaaria3645e52012-06-07 20:36:35 -030089 wlen = REQ_HDR_LEN;
90 rlen = ACK_HDR_LEN;
91 if (write) {
92 wlen += req->data_len;
Antti Palosaariaff8c2d2013-02-26 13:25:19 -030093 memcpy(&state->buf[REQ_HDR_LEN], req->data, req->data_len);
Antti Palosaaria3645e52012-06-07 20:36:35 -030094 } else {
95 rlen += req->data_len;
Antti Palosaari80619de2008-09-15 17:18:09 -030096 }
97
Antti Palosaaria3645e52012-06-07 20:36:35 -030098 /* no ack for these packets */
99 if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB)
100 rlen = 0;
101
Antti Palosaariaff8c2d2013-02-26 13:25:19 -0300102 ret = dvb_usbv2_generic_rw_locked(d,
103 state->buf, wlen, state->buf, rlen);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300104 if (ret)
105 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -0300106
Antti Palosaari80619de2008-09-15 17:18:09 -0300107 /* check status */
Antti Palosaariaff8c2d2013-02-26 13:25:19 -0300108 if (rlen && state->buf[1]) {
Antti Palosaarif2247492012-09-12 20:23:50 -0300109 dev_err(&d->udev->dev, "%s: command failed=%d\n",
Antti Palosaariaff8c2d2013-02-26 13:25:19 -0300110 KBUILD_MODNAME, state->buf[1]);
Antti Palosaarie1e9e512012-09-12 20:23:52 -0300111 ret = -EIO;
Antti Palosaaria3645e52012-06-07 20:36:35 -0300112 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -0300113 }
114
115 /* read request, copy returned data to return buf */
116 if (!write)
Antti Palosaariaff8c2d2013-02-26 13:25:19 -0300117 memcpy(req->data, &state->buf[ACK_HDR_LEN], req->data_len);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300118error:
Antti Palosaariaff8c2d2013-02-26 13:25:19 -0300119 mutex_unlock(&d->usb_mutex);
120
Antti Palosaari80619de2008-09-15 17:18:09 -0300121 return ret;
122}
123
Antti Palosaari80619de2008-09-15 17:18:09 -0300124static int af9015_write_regs(struct dvb_usb_device *d, u16 addr, u8 *val,
125 u8 len)
126{
127 struct req_t req = {WRITE_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
128 val};
129 return af9015_ctrl_msg(d, &req);
130}
131
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300132static int af9015_read_regs(struct dvb_usb_device *d, u16 addr, u8 *val, u8 len)
133{
134 struct req_t req = {READ_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
135 val};
136 return af9015_ctrl_msg(d, &req);
137}
138
Antti Palosaaria3645e52012-06-07 20:36:35 -0300139static int af9015_write_reg(struct dvb_usb_device *d, u16 addr, u8 val)
140{
141 return af9015_write_regs(d, addr, &val, 1);
142}
143
Antti Palosaari80619de2008-09-15 17:18:09 -0300144static int af9015_read_reg(struct dvb_usb_device *d, u16 addr, u8 *val)
145{
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300146 return af9015_read_regs(d, addr, val, 1);
Antti Palosaari80619de2008-09-15 17:18:09 -0300147}
148
149static int af9015_write_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
150 u8 val)
151{
Antti Palosaarie8089662012-06-16 18:13:06 -0300152 struct af9015_state *state = d_to_priv(d);
Antti Palosaari80619de2008-09-15 17:18:09 -0300153 struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val};
154
Antti Palosaaria3645e52012-06-07 20:36:35 -0300155 if (addr == state->af9013_config[0].i2c_addr ||
156 addr == state->af9013_config[1].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300157 req.addr_len = 3;
158
159 return af9015_ctrl_msg(d, &req);
160}
161
162static int af9015_read_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
163 u8 *val)
164{
Antti Palosaarie8089662012-06-16 18:13:06 -0300165 struct af9015_state *state = d_to_priv(d);
Antti Palosaari80619de2008-09-15 17:18:09 -0300166 struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val};
167
Antti Palosaaria3645e52012-06-07 20:36:35 -0300168 if (addr == state->af9013_config[0].i2c_addr ||
169 addr == state->af9013_config[1].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300170 req.addr_len = 3;
171
172 return af9015_ctrl_msg(d, &req);
173}
174
Antti Palosaaria3645e52012-06-07 20:36:35 -0300175static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op)
176{
177 int ret;
178 u8 val, mask = 0x01;
179
180 ret = af9015_read_reg(d, addr, &val);
181 if (ret)
182 return ret;
183
184 mask <<= bit;
185 if (op) {
186 /* set bit */
187 val |= mask;
188 } else {
189 /* clear bit */
190 mask ^= 0xff;
191 val &= mask;
192 }
193
194 return af9015_write_reg(d, addr, val);
195}
196
197static int af9015_set_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
198{
199 return af9015_do_reg_bit(d, addr, bit, 1);
200}
201
202static int af9015_clear_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
203{
204 return af9015_do_reg_bit(d, addr, bit, 0);
205}
206
Antti Palosaari80619de2008-09-15 17:18:09 -0300207static int af9015_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
208 int num)
209{
210 struct dvb_usb_device *d = i2c_get_adapdata(adap);
Antti Palosaarie8089662012-06-16 18:13:06 -0300211 struct af9015_state *state = d_to_priv(d);
Antti Palosaari80619de2008-09-15 17:18:09 -0300212 int ret = 0, i = 0;
213 u16 addr;
Antti Palosaari675375d2010-10-07 21:46:41 -0300214 u8 uninitialized_var(mbox), addr_len;
Antti Palosaari80619de2008-09-15 17:18:09 -0300215 struct req_t req;
216
Antti Palosaaribc050e62012-05-08 06:04:24 -0300217/*
Antti Palosaari80619de2008-09-15 17:18:09 -0300218The bus lock is needed because there is two tuners both using same I2C-address.
219Due to that the only way to select correct tuner is use demodulator I2C-gate.
220
221................................................
222. AF9015 includes integrated AF9013 demodulator.
223. ____________ ____________ . ____________
224.| uC | | demod | . | tuner |
225.|------------| |------------| . |------------|
226.| AF9015 | | AF9013/5 | . | MXL5003 |
227.| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
228.| | | | addr 0x38 | . | addr 0xc6 |
229.|____________| | |____________| . |____________|
230.................|..............................
231 | ____________ ____________
232 | | demod | | tuner |
233 | |------------| |------------|
234 | | AF9013 | | MXL5003 |
235 +----I2C-------|-----/ -----|-------I2C-------| |
236 | addr 0x3a | | addr 0xc6 |
237 |____________| |____________|
238*/
239 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
240 return -EAGAIN;
241
242 while (i < num) {
Antti Palosaaria3645e52012-06-07 20:36:35 -0300243 if (msg[i].addr == state->af9013_config[0].i2c_addr ||
244 msg[i].addr == state->af9013_config[1].i2c_addr) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300245 addr = msg[i].buf[0] << 8;
246 addr += msg[i].buf[1];
247 mbox = msg[i].buf[2];
248 addr_len = 3;
249 } else {
250 addr = msg[i].buf[0];
251 addr_len = 1;
Antti Palosaari675375d2010-10-07 21:46:41 -0300252 /* mbox is don't care in that case */
Antti Palosaari80619de2008-09-15 17:18:09 -0300253 }
254
255 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
Antti Palosaari709d9202011-06-17 21:16:38 -0300256 if (msg[i].len > 3 || msg[i+1].len > 61) {
257 ret = -EOPNOTSUPP;
258 goto error;
259 }
Antti Palosaaria3645e52012-06-07 20:36:35 -0300260 if (msg[i].addr == state->af9013_config[0].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300261 req.cmd = READ_MEMORY;
262 else
263 req.cmd = READ_I2C;
264 req.i2c_addr = msg[i].addr;
265 req.addr = addr;
266 req.mbox = mbox;
267 req.addr_len = addr_len;
268 req.data_len = msg[i+1].len;
269 req.data = &msg[i+1].buf[0];
270 ret = af9015_ctrl_msg(d, &req);
271 i += 2;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300272 } else if (msg[i].flags & I2C_M_RD) {
Antti Palosaari709d9202011-06-17 21:16:38 -0300273 if (msg[i].len > 61) {
274 ret = -EOPNOTSUPP;
275 goto error;
276 }
Antti Palosaaria3645e52012-06-07 20:36:35 -0300277 if (msg[i].addr == state->af9013_config[0].i2c_addr) {
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300278 ret = -EINVAL;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300279 goto error;
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300280 }
281 req.cmd = READ_I2C;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300282 req.i2c_addr = msg[i].addr;
283 req.addr = addr;
284 req.mbox = mbox;
285 req.addr_len = addr_len;
286 req.data_len = msg[i].len;
287 req.data = &msg[i].buf[0];
288 ret = af9015_ctrl_msg(d, &req);
289 i += 1;
Antti Palosaari80619de2008-09-15 17:18:09 -0300290 } else {
Antti Palosaari709d9202011-06-17 21:16:38 -0300291 if (msg[i].len > 21) {
292 ret = -EOPNOTSUPP;
293 goto error;
294 }
Antti Palosaaria3645e52012-06-07 20:36:35 -0300295 if (msg[i].addr == state->af9013_config[0].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300296 req.cmd = WRITE_MEMORY;
297 else
298 req.cmd = WRITE_I2C;
299 req.i2c_addr = msg[i].addr;
300 req.addr = addr;
301 req.mbox = mbox;
302 req.addr_len = addr_len;
303 req.data_len = msg[i].len-addr_len;
304 req.data = &msg[i].buf[addr_len];
305 ret = af9015_ctrl_msg(d, &req);
306 i += 1;
307 }
308 if (ret)
309 goto error;
310
311 }
312 ret = i;
313
314error:
315 mutex_unlock(&d->i2c_mutex);
316
317 return ret;
318}
319
320static u32 af9015_i2c_func(struct i2c_adapter *adapter)
321{
322 return I2C_FUNC_I2C;
323}
324
325static struct i2c_algorithm af9015_i2c_algo = {
326 .master_xfer = af9015_i2c_xfer,
327 .functionality = af9015_i2c_func,
328};
329
Antti Palosaaria0921af2012-06-18 23:42:53 -0300330static int af9015_identify_state(struct dvb_usb_device *d, const char **name)
Antti Palosaari80619de2008-09-15 17:18:09 -0300331{
332 int ret;
Antti Palosaaria3645e52012-06-07 20:36:35 -0300333 u8 reply;
334 struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
Antti Palosaari80619de2008-09-15 17:18:09 -0300335
Antti Palosaaria3645e52012-06-07 20:36:35 -0300336 ret = af9015_ctrl_msg(d, &req);
Antti Palosaari80619de2008-09-15 17:18:09 -0300337 if (ret)
338 return ret;
339
Antti Palosaarif2247492012-09-12 20:23:50 -0300340 dev_dbg(&d->udev->dev, "%s: reply=%02x\n", __func__, reply);
341
Antti Palosaaria3645e52012-06-07 20:36:35 -0300342 if (reply == 0x02)
343 ret = WARM;
Antti Palosaari80619de2008-09-15 17:18:09 -0300344 else
Antti Palosaaria3645e52012-06-07 20:36:35 -0300345 ret = COLD;
346
347 return ret;
348}
349
350static int af9015_download_firmware(struct dvb_usb_device *d,
351 const struct firmware *fw)
352{
Antti Palosaarie8089662012-06-16 18:13:06 -0300353 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300354 int i, len, remaining, ret;
355 struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL};
356 u16 checksum = 0;
Antti Palosaarif2247492012-09-12 20:23:50 -0300357 dev_dbg(&d->udev->dev, "%s:\n", __func__);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300358
359 /* calc checksum */
360 for (i = 0; i < fw->size; i++)
361 checksum += fw->data[i];
362
363 state->firmware_size = fw->size;
364 state->firmware_checksum = checksum;
365
366 #define FW_ADDR 0x5100 /* firmware start address */
367 #define LEN_MAX 55 /* max packet size */
368 for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) {
369 len = remaining;
370 if (len > LEN_MAX)
371 len = LEN_MAX;
372
373 req.data_len = len;
374 req.data = (u8 *) &fw->data[fw->size - remaining];
375 req.addr = FW_ADDR + fw->size - remaining;
376
377 ret = af9015_ctrl_msg(d, &req);
378 if (ret) {
Antti Palosaarif2247492012-09-12 20:23:50 -0300379 dev_err(&d->udev->dev,
380 "%s: firmware download failed=%d\n",
381 KBUILD_MODNAME, ret);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300382 goto error;
383 }
384 }
385
386 /* firmware loaded, request boot */
387 req.cmd = BOOT;
388 req.data_len = 0;
389 ret = af9015_ctrl_msg(d, &req);
390 if (ret) {
Antti Palosaarif2247492012-09-12 20:23:50 -0300391 dev_err(&d->udev->dev, "%s: firmware boot failed=%d\n",
392 KBUILD_MODNAME, ret);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300393 goto error;
394 }
395
396error:
397 return ret;
398}
399
400/* hash (and dump) eeprom */
401static int af9015_eeprom_hash(struct dvb_usb_device *d)
402{
Antti Palosaarie8089662012-06-16 18:13:06 -0300403 struct af9015_state *state = d_to_priv(d);
Antti Palosaari2e35c662012-09-12 20:23:51 -0300404 int ret, i;
405 static const unsigned int AF9015_EEPROM_SIZE = 256;
406 u8 buf[AF9015_EEPROM_SIZE];
407 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, NULL};
Antti Palosaaria3645e52012-06-07 20:36:35 -0300408
Antti Palosaari2e35c662012-09-12 20:23:51 -0300409 /* read eeprom */
410 for (i = 0; i < AF9015_EEPROM_SIZE; i++) {
411 req.addr = i;
412 req.data = &buf[i];
Antti Palosaaria3645e52012-06-07 20:36:35 -0300413 ret = af9015_ctrl_msg(d, &req);
Antti Palosaari2e35c662012-09-12 20:23:51 -0300414 if (ret < 0)
415 goto err;
Antti Palosaaria3645e52012-06-07 20:36:35 -0300416 }
417
Antti Palosaari2e35c662012-09-12 20:23:51 -0300418 /* calculate checksum */
419 for (i = 0; i < AF9015_EEPROM_SIZE / sizeof(u32); i++) {
Antti Palosaaria3645e52012-06-07 20:36:35 -0300420 state->eeprom_sum *= GOLDEN_RATIO_PRIME_32;
Antti Palosaari2e35c662012-09-12 20:23:51 -0300421 state->eeprom_sum += le32_to_cpu(((u32 *)buf)[i]);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300422 }
423
Antti Palosaari2e35c662012-09-12 20:23:51 -0300424 for (i = 0; i < AF9015_EEPROM_SIZE; i += 16)
425 dev_dbg(&d->udev->dev, "%s: %*ph\n", __func__, 16, buf + i);
426
Antti Palosaarif2247492012-09-12 20:23:50 -0300427 dev_dbg(&d->udev->dev, "%s: eeprom sum=%.8x\n",
428 __func__, state->eeprom_sum);
Antti Palosaari2e35c662012-09-12 20:23:51 -0300429 return 0;
430err:
431 dev_err(&d->udev->dev, "%s: eeprom failed=%d\n", KBUILD_MODNAME, ret);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300432 return ret;
433}
434
435static int af9015_read_config(struct dvb_usb_device *d)
436{
Antti Palosaarie8089662012-06-16 18:13:06 -0300437 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300438 int ret;
439 u8 val, i, offset = 0;
440 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
441
Antti Palosaarif2247492012-09-12 20:23:50 -0300442 dev_dbg(&d->udev->dev, "%s:\n", __func__);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300443
444 /* IR remote controller */
445 req.addr = AF9015_EEPROM_IR_MODE;
446 /* first message will timeout often due to possible hw bug */
447 for (i = 0; i < 4; i++) {
448 ret = af9015_ctrl_msg(d, &req);
449 if (!ret)
450 break;
451 }
452 if (ret)
453 goto error;
454
455 ret = af9015_eeprom_hash(d);
456 if (ret)
457 goto error;
458
Antti Palosaaria3645e52012-06-07 20:36:35 -0300459 state->ir_mode = val;
Antti Palosaarif2247492012-09-12 20:23:50 -0300460 dev_dbg(&d->udev->dev, "%s: IR mode=%d\n", __func__, val);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300461
462 /* TS mode - one or two receivers */
463 req.addr = AF9015_EEPROM_TS_MODE;
464 ret = af9015_ctrl_msg(d, &req);
465 if (ret)
466 goto error;
467
468 state->dual_mode = val;
Antti Palosaarif2247492012-09-12 20:23:50 -0300469 dev_dbg(&d->udev->dev, "%s: TS mode=%d\n", __func__, state->dual_mode);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300470
471 /* disable 2nd adapter because we don't have PID-filters */
472 if (d->udev->speed == USB_SPEED_FULL)
473 state->dual_mode = 0;
474
475 if (state->dual_mode) {
476 /* read 2nd demodulator I2C address */
477 req.addr = AF9015_EEPROM_DEMOD2_I2C;
478 ret = af9015_ctrl_msg(d, &req);
479 if (ret)
480 goto error;
481
482 state->af9013_config[1].i2c_addr = val;
483 }
484
485 for (i = 0; i < state->dual_mode + 1; i++) {
486 if (i == 1)
487 offset = AF9015_EEPROM_OFFSET;
488 /* xtal */
489 req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
490 ret = af9015_ctrl_msg(d, &req);
491 if (ret)
492 goto error;
493 switch (val) {
494 case 0:
495 state->af9013_config[i].clock = 28800000;
496 break;
497 case 1:
498 state->af9013_config[i].clock = 20480000;
499 break;
500 case 2:
501 state->af9013_config[i].clock = 28000000;
502 break;
503 case 3:
504 state->af9013_config[i].clock = 25000000;
505 break;
Peter Senna Tschudinc2c1b412012-09-28 05:37:22 -0300506 }
Antti Palosaarif2247492012-09-12 20:23:50 -0300507 dev_dbg(&d->udev->dev, "%s: [%d] xtal=%d set clock=%d\n",
508 __func__, i, val,
509 state->af9013_config[i].clock);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300510
511 /* IF frequency */
512 req.addr = AF9015_EEPROM_IF1H + offset;
513 ret = af9015_ctrl_msg(d, &req);
514 if (ret)
515 goto error;
516
517 state->af9013_config[i].if_frequency = val << 8;
518
519 req.addr = AF9015_EEPROM_IF1L + offset;
520 ret = af9015_ctrl_msg(d, &req);
521 if (ret)
522 goto error;
523
524 state->af9013_config[i].if_frequency += val;
525 state->af9013_config[i].if_frequency *= 1000;
Antti Palosaarif2247492012-09-12 20:23:50 -0300526 dev_dbg(&d->udev->dev, "%s: [%d] IF frequency=%d\n", __func__,
527 i, state->af9013_config[i].if_frequency);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300528
529 /* MT2060 IF1 */
530 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
531 ret = af9015_ctrl_msg(d, &req);
532 if (ret)
533 goto error;
534 state->mt2060_if1[i] = val << 8;
535 req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
536 ret = af9015_ctrl_msg(d, &req);
537 if (ret)
538 goto error;
539 state->mt2060_if1[i] += val;
Antti Palosaarif2247492012-09-12 20:23:50 -0300540 dev_dbg(&d->udev->dev, "%s: [%d] MT2060 IF1=%d\n", __func__, i,
Antti Palosaaria3645e52012-06-07 20:36:35 -0300541 state->mt2060_if1[i]);
542
543 /* tuner */
544 req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
545 ret = af9015_ctrl_msg(d, &req);
546 if (ret)
547 goto error;
548 switch (val) {
549 case AF9013_TUNER_ENV77H11D5:
550 case AF9013_TUNER_MT2060:
551 case AF9013_TUNER_QT1010:
552 case AF9013_TUNER_UNKNOWN:
553 case AF9013_TUNER_MT2060_2:
554 case AF9013_TUNER_TDA18271:
555 case AF9013_TUNER_QT1010A:
556 case AF9013_TUNER_TDA18218:
557 state->af9013_config[i].spec_inv = 1;
558 break;
559 case AF9013_TUNER_MXL5003D:
560 case AF9013_TUNER_MXL5005D:
561 case AF9013_TUNER_MXL5005R:
562 case AF9013_TUNER_MXL5007T:
563 state->af9013_config[i].spec_inv = 0;
564 break;
565 case AF9013_TUNER_MC44S803:
566 state->af9013_config[i].gpio[1] = AF9013_GPIO_LO;
567 state->af9013_config[i].spec_inv = 1;
568 break;
569 default:
Antti Palosaarif2247492012-09-12 20:23:50 -0300570 dev_err(&d->udev->dev, "%s: tuner id=%d not " \
571 "supported, please report!\n",
572 KBUILD_MODNAME, val);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300573 return -ENODEV;
Peter Senna Tschudinc2c1b412012-09-28 05:37:22 -0300574 }
Antti Palosaaria3645e52012-06-07 20:36:35 -0300575
576 state->af9013_config[i].tuner = val;
Antti Palosaarif2247492012-09-12 20:23:50 -0300577 dev_dbg(&d->udev->dev, "%s: [%d] tuner id=%d\n",
578 __func__, i, val);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300579 }
Antti Palosaari1e8750c2011-03-18 19:36:42 -0300580
Antti Palosaari80619de2008-09-15 17:18:09 -0300581error:
582 if (ret)
Antti Palosaarif2247492012-09-12 20:23:50 -0300583 dev_err(&d->udev->dev, "%s: eeprom read failed=%d\n",
584 KBUILD_MODNAME, ret);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300585
586 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
587 content :-( Override some wrong values here. Ditto for the
588 AVerTV Red HD+ (A850T) device. */
589 if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
590 ((le16_to_cpu(d->udev->descriptor.idProduct) ==
591 USB_PID_AVERMEDIA_A850) ||
592 (le16_to_cpu(d->udev->descriptor.idProduct) ==
593 USB_PID_AVERMEDIA_A850T))) {
Antti Palosaarif2247492012-09-12 20:23:50 -0300594 dev_dbg(&d->udev->dev,
595 "%s: AverMedia A850: overriding config\n",
596 __func__);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300597 /* disable dual mode */
598 state->dual_mode = 0;
599
600 /* set correct IF */
601 state->af9013_config[0].if_frequency = 4570000;
602 }
603
604 return ret;
605}
606
Antti Palosaarib905a2a2012-06-18 22:54:16 -0300607static int af9015_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
Antti Palosaaria3645e52012-06-07 20:36:35 -0300608 struct usb_data_stream_properties *stream)
609{
Antti Palosaarif2247492012-09-12 20:23:50 -0300610 struct dvb_usb_device *d = fe_to_d(fe);
611 dev_dbg(&d->udev->dev, "%s: adap=%d\n", __func__, fe_to_adap(fe)->id);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300612
Antti Palosaarif2247492012-09-12 20:23:50 -0300613 if (d->udev->speed == USB_SPEED_FULL)
Antti Palosaaria3645e52012-06-07 20:36:35 -0300614 stream->u.bulk.buffersize = TS_USB11_FRAME_SIZE;
615
616 return 0;
617}
618
619static int af9015_get_adapter_count(struct dvb_usb_device *d)
620{
Antti Palosaarie8089662012-06-16 18:13:06 -0300621 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300622 return state->dual_mode + 1;
623}
624
625/* override demod callbacks for resource locking */
626static int af9015_af9013_set_frontend(struct dvb_frontend *fe)
627{
628 int ret;
Antti Palosaarie8089662012-06-16 18:13:06 -0300629 struct af9015_state *state = fe_to_priv(fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300630
631 if (mutex_lock_interruptible(&state->fe_mutex))
632 return -EAGAIN;
633
Antti Palosaarie8089662012-06-16 18:13:06 -0300634 ret = state->set_frontend[fe_to_adap(fe)->id](fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300635
636 mutex_unlock(&state->fe_mutex);
637
638 return ret;
639}
640
641/* override demod callbacks for resource locking */
642static int af9015_af9013_read_status(struct dvb_frontend *fe,
643 fe_status_t *status)
644{
645 int ret;
Antti Palosaarie8089662012-06-16 18:13:06 -0300646 struct af9015_state *state = fe_to_priv(fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300647
648 if (mutex_lock_interruptible(&state->fe_mutex))
649 return -EAGAIN;
650
Antti Palosaarie8089662012-06-16 18:13:06 -0300651 ret = state->read_status[fe_to_adap(fe)->id](fe, status);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300652
653 mutex_unlock(&state->fe_mutex);
654
655 return ret;
656}
657
658/* override demod callbacks for resource locking */
659static int af9015_af9013_init(struct dvb_frontend *fe)
660{
661 int ret;
Antti Palosaarie8089662012-06-16 18:13:06 -0300662 struct af9015_state *state = fe_to_priv(fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300663
664 if (mutex_lock_interruptible(&state->fe_mutex))
665 return -EAGAIN;
666
Antti Palosaarie8089662012-06-16 18:13:06 -0300667 ret = state->init[fe_to_adap(fe)->id](fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300668
669 mutex_unlock(&state->fe_mutex);
670
671 return ret;
672}
673
674/* override demod callbacks for resource locking */
675static int af9015_af9013_sleep(struct dvb_frontend *fe)
676{
677 int ret;
Antti Palosaarie8089662012-06-16 18:13:06 -0300678 struct af9015_state *state = fe_to_priv(fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300679
680 if (mutex_lock_interruptible(&state->fe_mutex))
681 return -EAGAIN;
682
Antti Palosaarie8089662012-06-16 18:13:06 -0300683 ret = state->sleep[fe_to_adap(fe)->id](fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300684
685 mutex_unlock(&state->fe_mutex);
686
687 return ret;
688}
689
690/* override tuner callbacks for resource locking */
691static int af9015_tuner_init(struct dvb_frontend *fe)
692{
693 int ret;
Antti Palosaarie8089662012-06-16 18:13:06 -0300694 struct af9015_state *state = fe_to_priv(fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300695
696 if (mutex_lock_interruptible(&state->fe_mutex))
697 return -EAGAIN;
698
Antti Palosaarie8089662012-06-16 18:13:06 -0300699 ret = state->tuner_init[fe_to_adap(fe)->id](fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300700
701 mutex_unlock(&state->fe_mutex);
702
703 return ret;
704}
705
706/* override tuner callbacks for resource locking */
707static int af9015_tuner_sleep(struct dvb_frontend *fe)
708{
709 int ret;
Antti Palosaarie8089662012-06-16 18:13:06 -0300710 struct af9015_state *state = fe_to_priv(fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300711
712 if (mutex_lock_interruptible(&state->fe_mutex))
713 return -EAGAIN;
714
Antti Palosaarie8089662012-06-16 18:13:06 -0300715 ret = state->tuner_sleep[fe_to_adap(fe)->id](fe);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300716
717 mutex_unlock(&state->fe_mutex);
718
Antti Palosaari80619de2008-09-15 17:18:09 -0300719 return ret;
720}
721
722static int af9015_copy_firmware(struct dvb_usb_device *d)
723{
Antti Palosaarie8089662012-06-16 18:13:06 -0300724 struct af9015_state *state = d_to_priv(d);
Antti Palosaari80619de2008-09-15 17:18:09 -0300725 int ret;
726 u8 fw_params[4];
727 u8 val, i;
728 struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
729 fw_params };
Antti Palosaarif2247492012-09-12 20:23:50 -0300730 dev_dbg(&d->udev->dev, "%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -0300731
Antti Palosaaria3645e52012-06-07 20:36:35 -0300732 fw_params[0] = state->firmware_size >> 8;
733 fw_params[1] = state->firmware_size & 0xff;
734 fw_params[2] = state->firmware_checksum >> 8;
735 fw_params[3] = state->firmware_checksum & 0xff;
Antti Palosaari80619de2008-09-15 17:18:09 -0300736
737 /* wait 2nd demodulator ready */
738 msleep(100);
739
Antti Palosaaria3645e52012-06-07 20:36:35 -0300740 ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
741 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300742 if (ret)
743 goto error;
744 else
Antti Palosaarif2247492012-09-12 20:23:50 -0300745 dev_dbg(&d->udev->dev, "%s: firmware status=%02x\n",
746 __func__, val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300747
748 if (val == 0x0c) /* fw is running, no need for download */
749 goto exit;
750
751 /* set I2C master clock to fast (to speed up firmware copy) */
752 ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
753 if (ret)
754 goto error;
755
756 msleep(50);
757
758 /* copy firmware */
759 ret = af9015_ctrl_msg(d, &req);
760 if (ret)
Antti Palosaarif2247492012-09-12 20:23:50 -0300761 dev_err(&d->udev->dev, "%s: firmware copy cmd failed=%d\n",
762 KBUILD_MODNAME, ret);
763
764 dev_dbg(&d->udev->dev, "%s: firmware copy done\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -0300765
766 /* set I2C master clock back to normal */
767 ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
768 if (ret)
769 goto error;
770
771 /* request boot firmware */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300772 ret = af9015_write_reg_i2c(d, state->af9013_config[1].i2c_addr,
773 0xe205, 1);
Antti Palosaarif2247492012-09-12 20:23:50 -0300774 dev_dbg(&d->udev->dev, "%s: firmware boot cmd status=%d\n",
775 __func__, ret);
Antti Palosaari80619de2008-09-15 17:18:09 -0300776 if (ret)
777 goto error;
778
779 for (i = 0; i < 15; i++) {
780 msleep(100);
781
782 /* check firmware status */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300783 ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
784 0x98be, &val);
Antti Palosaarif2247492012-09-12 20:23:50 -0300785 dev_dbg(&d->udev->dev, "%s: firmware status cmd status=%d " \
786 "firmware status=%02x\n", __func__, ret, val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300787 if (ret)
788 goto error;
789
790 if (val == 0x0c || val == 0x04) /* success or fail */
791 break;
792 }
793
794 if (val == 0x04) {
Antti Palosaarif2247492012-09-12 20:23:50 -0300795 dev_err(&d->udev->dev, "%s: firmware did not run\n",
796 KBUILD_MODNAME);
Antti Palosaarie1e9e512012-09-12 20:23:52 -0300797 ret = -ETIMEDOUT;
Antti Palosaari80619de2008-09-15 17:18:09 -0300798 } else if (val != 0x0c) {
Antti Palosaarif2247492012-09-12 20:23:50 -0300799 dev_err(&d->udev->dev, "%s: firmware boot timeout\n",
800 KBUILD_MODNAME);
Antti Palosaarie1e9e512012-09-12 20:23:52 -0300801 ret = -ETIMEDOUT;
Antti Palosaari80619de2008-09-15 17:18:09 -0300802 }
803
804error:
805exit:
806 return ret;
807}
808
Antti Palosaari80619de2008-09-15 17:18:09 -0300809static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
810{
811 int ret;
Antti Palosaarie8089662012-06-16 18:13:06 -0300812 struct af9015_state *state = adap_to_priv(adap);
Antti Palosaari80619de2008-09-15 17:18:09 -0300813
Antti Palosaaria3645e52012-06-07 20:36:35 -0300814 if (adap->id == 0) {
815 state->af9013_config[0].ts_mode = AF9013_TS_USB;
816 memcpy(state->af9013_config[0].api_version, "\x0\x1\x9\x0", 4);
817 state->af9013_config[0].gpio[0] = AF9013_GPIO_HI;
818 state->af9013_config[0].gpio[3] = AF9013_GPIO_TUNER_ON;
819 } else if (adap->id == 1) {
820 state->af9013_config[1].ts_mode = AF9013_TS_SERIAL;
821 memcpy(state->af9013_config[1].api_version, "\x0\x1\x9\x0", 4);
822 state->af9013_config[1].gpio[0] = AF9013_GPIO_TUNER_ON;
823 state->af9013_config[1].gpio[1] = AF9013_GPIO_LO;
824
Antti Palosaari80619de2008-09-15 17:18:09 -0300825 /* copy firmware to 2nd demodulator */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300826 if (state->dual_mode) {
Antti Palosaarie8089662012-06-16 18:13:06 -0300827 ret = af9015_copy_firmware(adap_to_d(adap));
Antti Palosaari80619de2008-09-15 17:18:09 -0300828 if (ret) {
Antti Palosaarif2247492012-09-12 20:23:50 -0300829 dev_err(&adap_to_d(adap)->udev->dev,
830 "%s: firmware copy to 2nd " \
831 "frontend failed, will " \
832 "disable it\n", KBUILD_MODNAME);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300833 state->dual_mode = 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300834 return -ENODEV;
835 }
836 } else {
837 return -ENODEV;
838 }
839 }
840
841 /* attach demodulator */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300842 adap->fe[0] = dvb_attach(af9013_attach,
Antti Palosaarie8089662012-06-16 18:13:06 -0300843 &state->af9013_config[adap->id], &adap_to_d(adap)->i2c_adap);
Antti Palosaari80619de2008-09-15 17:18:09 -0300844
Antti Palosaarie90ab842011-11-12 22:33:30 -0300845 /*
846 * AF9015 firmware does not like if it gets interrupted by I2C adapter
847 * request on some critical phases. During normal operation I2C adapter
848 * is used only 2nd demodulator and tuner on dual tuner devices.
849 * Override demodulator callbacks and use mutex for limit access to
850 * those "critical" paths to keep AF9015 happy.
Antti Palosaarie90ab842011-11-12 22:33:30 -0300851 */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300852 if (adap->fe[0]) {
Antti Palosaarie90ab842011-11-12 22:33:30 -0300853 state->set_frontend[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -0300854 adap->fe[0]->ops.set_frontend;
855 adap->fe[0]->ops.set_frontend =
Antti Palosaarie90ab842011-11-12 22:33:30 -0300856 af9015_af9013_set_frontend;
857
858 state->read_status[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -0300859 adap->fe[0]->ops.read_status;
860 adap->fe[0]->ops.read_status =
Antti Palosaarie90ab842011-11-12 22:33:30 -0300861 af9015_af9013_read_status;
862
Antti Palosaaria3645e52012-06-07 20:36:35 -0300863 state->init[adap->id] = adap->fe[0]->ops.init;
864 adap->fe[0]->ops.init = af9015_af9013_init;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300865
Antti Palosaaria3645e52012-06-07 20:36:35 -0300866 state->sleep[adap->id] = adap->fe[0]->ops.sleep;
867 adap->fe[0]->ops.sleep = af9015_af9013_sleep;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300868 }
869
Antti Palosaaria3645e52012-06-07 20:36:35 -0300870 return adap->fe[0] == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300871}
872
873static struct mt2060_config af9015_mt2060_config = {
874 .i2c_address = 0xc0,
875 .clock_out = 0,
876};
877
878static struct qt1010_config af9015_qt1010_config = {
879 .i2c_address = 0xc4,
880};
881
882static struct tda18271_config af9015_tda18271_config = {
883 .gate = TDA18271_GATE_DIGITAL,
Mauro Carvalho Chehab7655e592010-10-27 14:55:34 -0200884 .small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
Antti Palosaari80619de2008-09-15 17:18:09 -0300885};
886
887static struct mxl5005s_config af9015_mxl5003_config = {
888 .i2c_address = 0xc6,
889 .if_freq = IF_FREQ_4570000HZ,
890 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
891 .agc_mode = MXL_SINGLE_AGC,
892 .tracking_filter = MXL_TF_DEFAULT,
Antti Palosaaria1310772008-09-22 13:59:25 -0300893 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -0300894 .cap_select = MXL_CAP_SEL_ENABLE,
895 .div_out = MXL_DIV_OUT_4,
896 .clock_out = MXL_CLOCK_OUT_DISABLE,
897 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
898 .top = MXL5005S_TOP_25P2,
899 .mod_mode = MXL_DIGITAL_MODE,
900 .if_mode = MXL_ZERO_IF,
901 .AgcMasterByte = 0x00,
902};
903
904static struct mxl5005s_config af9015_mxl5005_config = {
905 .i2c_address = 0xc6,
906 .if_freq = IF_FREQ_4570000HZ,
907 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
908 .agc_mode = MXL_SINGLE_AGC,
909 .tracking_filter = MXL_TF_OFF,
Antti Palosaaria1310772008-09-22 13:59:25 -0300910 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -0300911 .cap_select = MXL_CAP_SEL_ENABLE,
912 .div_out = MXL_DIV_OUT_4,
913 .clock_out = MXL_CLOCK_OUT_DISABLE,
914 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
915 .top = MXL5005S_TOP_25P2,
916 .mod_mode = MXL_DIGITAL_MODE,
917 .if_mode = MXL_ZERO_IF,
918 .AgcMasterByte = 0x00,
919};
920
Jochen Friedrichd5633992009-02-02 14:59:50 -0300921static struct mc44s803_config af9015_mc44s803_config = {
922 .i2c_address = 0xc0,
923 .dig_out = 1,
924};
925
Antti Palosaariee3d4402010-08-13 03:51:26 -0300926static struct tda18218_config af9015_tda18218_config = {
927 .i2c_address = 0xc0,
928 .i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
929};
930
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300931static struct mxl5007t_config af9015_mxl5007t_config = {
932 .xtal_freq_hz = MxL_XTAL_24_MHZ,
933 .if_freq_hz = MxL_IF_4_57_MHZ,
934};
935
Antti Palosaari80619de2008-09-15 17:18:09 -0300936static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
937{
Antti Palosaarif2247492012-09-12 20:23:50 -0300938 struct dvb_usb_device *d = adap_to_d(adap);
939 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300940 int ret;
Antti Palosaarif2247492012-09-12 20:23:50 -0300941 dev_dbg(&d->udev->dev, "%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -0300942
Antti Palosaaria3645e52012-06-07 20:36:35 -0300943 switch (state->af9013_config[adap->id].tuner) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300944 case AF9013_TUNER_MT2060:
945 case AF9013_TUNER_MT2060_2:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300946 ret = dvb_attach(mt2060_attach, adap->fe[0],
Antti Palosaarie8089662012-06-16 18:13:06 -0300947 &adap_to_d(adap)->i2c_adap, &af9015_mt2060_config,
Antti Palosaaria3645e52012-06-07 20:36:35 -0300948 state->mt2060_if1[adap->id])
Antti Palosaari80619de2008-09-15 17:18:09 -0300949 == NULL ? -ENODEV : 0;
950 break;
951 case AF9013_TUNER_QT1010:
952 case AF9013_TUNER_QT1010A:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300953 ret = dvb_attach(qt1010_attach, adap->fe[0],
Antti Palosaarie8089662012-06-16 18:13:06 -0300954 &adap_to_d(adap)->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300955 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
956 break;
957 case AF9013_TUNER_TDA18271:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300958 ret = dvb_attach(tda18271_attach, adap->fe[0], 0xc0,
Antti Palosaarie8089662012-06-16 18:13:06 -0300959 &adap_to_d(adap)->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300960 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
961 break;
Antti Palosaariee3d4402010-08-13 03:51:26 -0300962 case AF9013_TUNER_TDA18218:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300963 ret = dvb_attach(tda18218_attach, adap->fe[0],
Antti Palosaarie8089662012-06-16 18:13:06 -0300964 &adap_to_d(adap)->i2c_adap,
Antti Palosaariee3d4402010-08-13 03:51:26 -0300965 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
966 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300967 case AF9013_TUNER_MXL5003D:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300968 ret = dvb_attach(mxl5005s_attach, adap->fe[0],
Antti Palosaarie8089662012-06-16 18:13:06 -0300969 &adap_to_d(adap)->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300970 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
971 break;
972 case AF9013_TUNER_MXL5005D:
973 case AF9013_TUNER_MXL5005R:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300974 ret = dvb_attach(mxl5005s_attach, adap->fe[0],
Antti Palosaarie8089662012-06-16 18:13:06 -0300975 &adap_to_d(adap)->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300976 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
977 break;
978 case AF9013_TUNER_ENV77H11D5:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300979 ret = dvb_attach(dvb_pll_attach, adap->fe[0], 0xc0,
Antti Palosaarie8089662012-06-16 18:13:06 -0300980 &adap_to_d(adap)->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300981 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
982 break;
983 case AF9013_TUNER_MC44S803:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300984 ret = dvb_attach(mc44s803_attach, adap->fe[0],
Antti Palosaarie8089662012-06-16 18:13:06 -0300985 &adap_to_d(adap)->i2c_adap,
Jochen Friedrichd5633992009-02-02 14:59:50 -0300986 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300987 break;
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300988 case AF9013_TUNER_MXL5007T:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300989 ret = dvb_attach(mxl5007t_attach, adap->fe[0],
Antti Palosaarie8089662012-06-16 18:13:06 -0300990 &adap_to_d(adap)->i2c_adap,
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300991 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
992 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300993 case AF9013_TUNER_UNKNOWN:
994 default:
Antti Palosaarif2247492012-09-12 20:23:50 -0300995 dev_err(&d->udev->dev, "%s: unknown tuner id=%d\n",
996 KBUILD_MODNAME,
997 state->af9013_config[adap->id].tuner);
Antti Palosaari80619de2008-09-15 17:18:09 -0300998 ret = -ENODEV;
Antti Palosaari80619de2008-09-15 17:18:09 -0300999 }
Gordon Heckerbe4a5e72012-03-14 10:27:30 -03001000
Antti Palosaaria3645e52012-06-07 20:36:35 -03001001 if (adap->fe[0]->ops.tuner_ops.init) {
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001002 state->tuner_init[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -03001003 adap->fe[0]->ops.tuner_ops.init;
1004 adap->fe[0]->ops.tuner_ops.init = af9015_tuner_init;
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001005 }
Gordon Heckerbe4a5e72012-03-14 10:27:30 -03001006
Antti Palosaaria3645e52012-06-07 20:36:35 -03001007 if (adap->fe[0]->ops.tuner_ops.sleep) {
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001008 state->tuner_sleep[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -03001009 adap->fe[0]->ops.tuner_ops.sleep;
1010 adap->fe[0]->ops.tuner_ops.sleep = af9015_tuner_sleep;
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001011 }
1012
Antti Palosaari80619de2008-09-15 17:18:09 -03001013 return ret;
1014}
1015
Antti Palosaaria3645e52012-06-07 20:36:35 -03001016static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
1017{
Antti Palosaarif2247492012-09-12 20:23:50 -03001018 struct dvb_usb_device *d = adap_to_d(adap);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001019 int ret;
Antti Palosaarif2247492012-09-12 20:23:50 -03001020 dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001021
1022 if (onoff)
Antti Palosaarif2247492012-09-12 20:23:50 -03001023 ret = af9015_set_reg_bit(d, 0xd503, 0);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001024 else
Antti Palosaarif2247492012-09-12 20:23:50 -03001025 ret = af9015_clear_reg_bit(d, 0xd503, 0);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001026
1027 return ret;
1028}
1029
1030static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
1031 int onoff)
1032{
Antti Palosaarif2247492012-09-12 20:23:50 -03001033 struct dvb_usb_device *d = adap_to_d(adap);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001034 int ret;
1035 u8 idx;
Antti Palosaarif2247492012-09-12 20:23:50 -03001036 dev_dbg(&d->udev->dev, "%s: index=%d pid=%04x onoff=%d\n",
1037 __func__, index, pid, onoff);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001038
Antti Palosaarif2247492012-09-12 20:23:50 -03001039 ret = af9015_write_reg(d, 0xd505, (pid & 0xff));
Antti Palosaaria3645e52012-06-07 20:36:35 -03001040 if (ret)
1041 goto error;
1042
Antti Palosaarif2247492012-09-12 20:23:50 -03001043 ret = af9015_write_reg(d, 0xd506, (pid >> 8));
Antti Palosaaria3645e52012-06-07 20:36:35 -03001044 if (ret)
1045 goto error;
1046
1047 idx = ((index & 0x1f) | (1 << 5));
Antti Palosaarif2247492012-09-12 20:23:50 -03001048 ret = af9015_write_reg(d, 0xd504, idx);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001049
1050error:
1051 return ret;
1052}
1053
1054static int af9015_init_endpoint(struct dvb_usb_device *d)
1055{
Antti Palosaarie8089662012-06-16 18:13:06 -03001056 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001057 int ret;
1058 u16 frame_size;
1059 u8 packet_size;
Antti Palosaarif2247492012-09-12 20:23:50 -03001060 dev_dbg(&d->udev->dev, "%s: USB speed=%d\n", __func__, d->udev->speed);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001061
1062 if (d->udev->speed == USB_SPEED_FULL) {
1063 frame_size = TS_USB11_FRAME_SIZE/4;
1064 packet_size = TS_USB11_MAX_PACKET_SIZE/4;
1065 } else {
1066 frame_size = TS_USB20_FRAME_SIZE/4;
1067 packet_size = TS_USB20_MAX_PACKET_SIZE/4;
1068 }
1069
1070 ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
1071 if (ret)
1072 goto error;
1073 ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
1074 if (ret)
1075 goto error;
1076 ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
1077 if (ret)
1078 goto error;
1079 ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
1080 if (ret)
1081 goto error;
1082 ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
1083 if (ret)
1084 goto error;
1085 if (state->dual_mode) {
1086 ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
1087 if (ret)
1088 goto error;
1089 }
1090 ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
1091 if (ret)
1092 goto error;
1093 if (state->dual_mode) {
1094 ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
1095 if (ret)
1096 goto error;
1097 }
1098 /* EP4 xfer length */
1099 ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
1100 if (ret)
1101 goto error;
1102 ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
1103 if (ret)
1104 goto error;
1105 /* EP5 xfer length */
1106 ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
1107 if (ret)
1108 goto error;
1109 ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
1110 if (ret)
1111 goto error;
1112 ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
1113 if (ret)
1114 goto error;
1115 ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
1116 if (ret)
1117 goto error;
1118 ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
1119 if (ret)
1120 goto error;
1121 if (state->dual_mode) {
1122 ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
1123 if (ret)
1124 goto error;
1125 }
1126
1127 /* enable / disable mp2if2 */
1128 if (state->dual_mode)
1129 ret = af9015_set_reg_bit(d, 0xd50b, 0);
1130 else
1131 ret = af9015_clear_reg_bit(d, 0xd50b, 0);
1132
1133error:
1134 if (ret)
Antti Palosaarif2247492012-09-12 20:23:50 -03001135 dev_err(&d->udev->dev, "%s: endpoint init failed=%d\n",
1136 KBUILD_MODNAME, ret);
1137
Antti Palosaaria3645e52012-06-07 20:36:35 -03001138 return ret;
1139}
1140
1141static int af9015_init(struct dvb_usb_device *d)
1142{
Antti Palosaarie8089662012-06-16 18:13:06 -03001143 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001144 int ret;
Antti Palosaarif2247492012-09-12 20:23:50 -03001145 dev_dbg(&d->udev->dev, "%s:\n", __func__);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001146
1147 mutex_init(&state->fe_mutex);
1148
1149 /* init RC canary */
1150 ret = af9015_write_reg(d, 0x98e9, 0xff);
1151 if (ret)
1152 goto error;
1153
1154 ret = af9015_init_endpoint(d);
1155 if (ret)
1156 goto error;
1157
1158error:
1159 return ret;
1160}
1161
Antti Palosaari37b44a02013-01-04 15:21:26 -03001162#if IS_ENABLED(CONFIG_RC_CORE)
Antti Palosaaria3645e52012-06-07 20:36:35 -03001163struct af9015_rc_setup {
1164 unsigned int id;
1165 char *rc_codes;
Jonathan Niederd07b9012012-01-07 04:11:27 -03001166};
1167
Antti Palosaaria3645e52012-06-07 20:36:35 -03001168static char *af9015_rc_setup_match(unsigned int id,
1169 const struct af9015_rc_setup *table)
1170{
1171 for (; table->rc_codes; table++)
1172 if (table->id == id)
1173 return table->rc_codes;
1174 return NULL;
1175}
1176
1177static const struct af9015_rc_setup af9015_rc_setup_modparam[] = {
1178 { AF9015_REMOTE_A_LINK_DTU_M, RC_MAP_ALINK_DTU_M },
1179 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, RC_MAP_MSI_DIGIVOX_II },
1180 { AF9015_REMOTE_MYGICTV_U718, RC_MAP_TOTAL_MEDIA_IN_HAND },
1181 { AF9015_REMOTE_DIGITTRADE_DVB_T, RC_MAP_DIGITTRADE },
1182 { AF9015_REMOTE_AVERMEDIA_KS, RC_MAP_AVERMEDIA_RM_KS },
Jonathan Niederd07b9012012-01-07 04:11:27 -03001183 { }
Antti Palosaari80619de2008-09-15 17:18:09 -03001184};
Antti Palosaari80619de2008-09-15 17:18:09 -03001185
Antti Palosaaria3645e52012-06-07 20:36:35 -03001186static const struct af9015_rc_setup af9015_rc_setup_hashes[] = {
1187 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II },
1188 { 0xa3703d00, RC_MAP_ALINK_DTU_M },
1189 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND }, /* MYGICTV U718 */
1190 { 0x5d49e3db, RC_MAP_DIGITTRADE }, /* LC-Power LC-USB-DVBT */
1191 { }
1192};
Antti Palosaari80619de2008-09-15 17:18:09 -03001193
Antti Palosaaria3645e52012-06-07 20:36:35 -03001194static int af9015_rc_query(struct dvb_usb_device *d)
1195{
Antti Palosaarie8089662012-06-16 18:13:06 -03001196 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001197 int ret;
1198 u8 buf[17];
Antti Palosaari80619de2008-09-15 17:18:09 -03001199
Antti Palosaaria3645e52012-06-07 20:36:35 -03001200 /* read registers needed to detect remote controller code */
1201 ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
1202 if (ret)
1203 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -03001204
Antti Palosaaria3645e52012-06-07 20:36:35 -03001205 /* If any of these are non-zero, assume invalid data */
Antti Palosaarif2247492012-09-12 20:23:50 -03001206 if (buf[1] || buf[2] || buf[3]) {
1207 dev_dbg(&d->udev->dev, "%s: invalid data\n", __func__);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001208 return ret;
Antti Palosaarif2247492012-09-12 20:23:50 -03001209 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001210
Antti Palosaaria3645e52012-06-07 20:36:35 -03001211 /* Check for repeat of previous code */
1212 if ((state->rc_repeat != buf[6] || buf[0]) &&
1213 !memcmp(&buf[12], state->rc_last, 4)) {
Antti Palosaarif2247492012-09-12 20:23:50 -03001214 dev_dbg(&d->udev->dev, "%s: key repeated\n", __func__);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001215 rc_keydown(d->rc_dev, state->rc_keycode, 0);
1216 state->rc_repeat = buf[6];
1217 return ret;
1218 }
1219
1220 /* Only process key if canary killed */
1221 if (buf[16] != 0xff && buf[0] != 0x01) {
Antti Palosaarif2247492012-09-12 20:23:50 -03001222 dev_dbg(&d->udev->dev, "%s: key pressed %*ph\n",
1223 __func__, 4, buf + 12);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001224
1225 /* Reset the canary */
1226 ret = af9015_write_reg(d, 0x98e9, 0xff);
1227 if (ret)
1228 goto error;
1229
1230 /* Remember this key */
1231 memcpy(state->rc_last, &buf[12], 4);
1232 if (buf[14] == (u8) ~buf[15]) {
1233 if (buf[12] == (u8) ~buf[13]) {
1234 /* NEC */
1235 state->rc_keycode = buf[12] << 8 | buf[14];
1236 } else {
1237 /* NEC extended*/
1238 state->rc_keycode = buf[12] << 16 |
1239 buf[13] << 8 | buf[14];
Antti Palosaari80619de2008-09-15 17:18:09 -03001240 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001241 } else {
1242 /* 32 bit NEC */
1243 state->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1244 buf[14] << 8 | buf[15];
Antti Palosaari80619de2008-09-15 17:18:09 -03001245 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001246 rc_keydown(d->rc_dev, state->rc_keycode, 0);
1247 } else {
Antti Palosaarif2247492012-09-12 20:23:50 -03001248 dev_dbg(&d->udev->dev, "%s: no key press\n", __func__);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001249 /* Invalidate last keypress */
1250 /* Not really needed, but helps with debug */
1251 state->rc_last[2] = state->rc_last[3];
1252 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001253
Antti Palosaaria3645e52012-06-07 20:36:35 -03001254 state->rc_repeat = buf[6];
Antti Palosaarieb29fbe2012-07-24 21:21:04 -03001255 state->rc_failed = false;
Antti Palosaari80619de2008-09-15 17:18:09 -03001256
Antti Palosaaria3645e52012-06-07 20:36:35 -03001257error:
Antti Palosaarieb29fbe2012-07-24 21:21:04 -03001258 if (ret) {
Antti Palosaarif2247492012-09-12 20:23:50 -03001259 dev_warn(&d->udev->dev, "%s: rc query failed=%d\n",
1260 KBUILD_MODNAME, ret);
Antti Palosaari80619de2008-09-15 17:18:09 -03001261
Antti Palosaarieb29fbe2012-07-24 21:21:04 -03001262 /* allow random errors as dvb-usb will stop polling on error */
1263 if (!state->rc_failed)
1264 ret = 0;
1265
1266 state->rc_failed = true;
1267 }
1268
Antti Palosaaria3645e52012-06-07 20:36:35 -03001269 return ret;
1270}
Antti Palosaari80619de2008-09-15 17:18:09 -03001271
Antti Palosaaria3645e52012-06-07 20:36:35 -03001272static int af9015_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
1273{
Antti Palosaarie8089662012-06-16 18:13:06 -03001274 struct af9015_state *state = d_to_priv(d);
Antti Palosaaria3645e52012-06-07 20:36:35 -03001275 u16 vid = le16_to_cpu(d->udev->descriptor.idVendor);
Antti Palosaari80619de2008-09-15 17:18:09 -03001276
Antti Palosaaria3645e52012-06-07 20:36:35 -03001277 if (state->ir_mode == AF9015_IR_MODE_DISABLED)
1278 return 0;
Antti Palosaari80619de2008-09-15 17:18:09 -03001279
Antti Palosaaria3645e52012-06-07 20:36:35 -03001280 /* try to load remote based module param */
Antti Palosaarieb29fbe2012-07-24 21:21:04 -03001281 if (!rc->map_name)
1282 rc->map_name = af9015_rc_setup_match(dvb_usb_af9015_remote,
1283 af9015_rc_setup_modparam);
Antti Palosaari80619de2008-09-15 17:18:09 -03001284
Antti Palosaaria3645e52012-06-07 20:36:35 -03001285 /* try to load remote based eeprom hash */
1286 if (!rc->map_name)
1287 rc->map_name = af9015_rc_setup_match(state->eeprom_sum,
1288 af9015_rc_setup_hashes);
Antti Palosaari80619de2008-09-15 17:18:09 -03001289
Antti Palosaaria3645e52012-06-07 20:36:35 -03001290 /* try to load remote based USB iManufacturer string */
1291 if (!rc->map_name && vid == USB_VID_AFATECH) {
1292 /* Check USB manufacturer and product strings and try
1293 to determine correct remote in case of chip vendor
1294 reference IDs are used.
1295 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
1296 char manufacturer[10];
1297 memset(manufacturer, 0, sizeof(manufacturer));
1298 usb_string(d->udev, d->udev->descriptor.iManufacturer,
1299 manufacturer, sizeof(manufacturer));
1300 if (!strcmp("MSI", manufacturer)) {
1301 /* iManufacturer 1 MSI
1302 iProduct 2 MSI K-VOX */
1303 rc->map_name = af9015_rc_setup_match(
1304 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
1305 af9015_rc_setup_modparam);
Antti Palosaari80619de2008-09-15 17:18:09 -03001306 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001307 }
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001308
Antti Palosaaride73bee2012-07-05 19:57:07 -03001309 /* load empty to enable rc */
1310 if (!rc->map_name)
1311 rc->map_name = RC_MAP_EMPTY;
1312
David Härdemanc003ab12012-10-11 19:11:54 -03001313 rc->allowed_protos = RC_BIT_NEC;
Antti Palosaaria3645e52012-06-07 20:36:35 -03001314 rc->query = af9015_rc_query;
1315 rc->interval = 500;
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001316
Antti Palosaaria3645e52012-06-07 20:36:35 -03001317 return 0;
1318}
Antti Palosaarib6215592012-12-09 20:15:47 -03001319#else
1320 #define af9015_get_rc_config NULL
1321#endif
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001322
Antti Palosaaria3645e52012-06-07 20:36:35 -03001323/* interface 0 is used by DVB-T receiver and
1324 interface 1 is for remote controller (HID) */
1325static struct dvb_usb_device_properties af9015_props = {
1326 .driver_name = KBUILD_MODNAME,
1327 .owner = THIS_MODULE,
1328 .adapter_nr = adapter_nr,
1329 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001330
Antti Palosaaria3645e52012-06-07 20:36:35 -03001331 .generic_bulk_ctrl_endpoint = 0x02,
1332 .generic_bulk_ctrl_endpoint_response = 0x81,
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001333
Antti Palosaaria3645e52012-06-07 20:36:35 -03001334 .identify_state = af9015_identify_state,
Antti Palosaaribab9b4f2012-09-12 11:37:25 -03001335 .firmware = AF9015_FIRMWARE,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001336 .download_firmware = af9015_download_firmware,
1337
Antti Palosaaria3645e52012-06-07 20:36:35 -03001338 .i2c_algo = &af9015_i2c_algo,
Antti Palosaari2d2b37c72012-06-12 01:05:20 -03001339 .read_config = af9015_read_config,
1340 .frontend_attach = af9015_af9013_frontend_attach,
1341 .tuner_attach = af9015_tuner_attach,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001342 .init = af9015_init,
1343 .get_rc_config = af9015_get_rc_config,
Antti Palosaarib905a2a2012-06-18 22:54:16 -03001344 .get_stream_config = af9015_get_stream_config,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001345
1346 .get_adapter_count = af9015_get_adapter_count,
1347 .adapter = {
1348 {
1349 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1350 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1351 .pid_filter_count = 32,
1352 .pid_filter = af9015_pid_filter,
1353 .pid_filter_ctrl = af9015_pid_filter_ctrl,
Antti Palosaari1a590012012-06-16 16:25:22 -03001354
1355 .stream = DVB_USB_STREAM_BULK(0x84, 8, TS_USB20_FRAME_SIZE),
1356 }, {
1357 .stream = DVB_USB_STREAM_BULK(0x85, 8, TS_USB20_FRAME_SIZE),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001358 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001359 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001360};
Antti Palosaari80619de2008-09-15 17:18:09 -03001361
Antti Palosaaria3645e52012-06-07 20:36:35 -03001362static const struct usb_device_id af9015_id_table[] = {
1363 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015,
1364 &af9015_props, "Afatech AF9015 reference design", NULL) },
1365 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016,
1366 &af9015_props, "Afatech AF9015 reference design", NULL) },
1367 { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD,
1368 &af9015_props, "Leadtek WinFast DTV Dongle Gold", RC_MAP_LEADTEK_Y04G0051) },
1369 { DVB_USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E,
1370 &af9015_props, "Pinnacle PCTV 71e", NULL) },
1371 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U,
1372 &af9015_props, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL) },
1373 { DVB_USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TINYTWIN,
1374 &af9015_props, "DigitalNow TinyTwin", RC_MAP_AZUREWAVE_AD_TU700) },
1375 { DVB_USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_AZUREWAVE_AD_TU700,
1376 &af9015_props, "TwinHan AzureWave AD-TU700(704J)", RC_MAP_AZUREWAVE_AD_TU700) },
1377 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2,
1378 &af9015_props, "TerraTec Cinergy T USB XE", NULL) },
1379 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T,
1380 &af9015_props, "KWorld PlusTV Dual DVB-T PCI (DVB-T PC160-2T)", NULL) },
1381 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X,
1382 &af9015_props, "AVerMedia AVerTV DVB-T Volar X", RC_MAP_AVERMEDIA_M135A) },
1383 { DVB_USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380,
1384 &af9015_props, "Xtensions XD-380", NULL) },
1385 { DVB_USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO,
1386 &af9015_props, "MSI DIGIVOX Duo", RC_MAP_MSI_DIGIVOX_III) },
1387 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2,
1388 &af9015_props, "Fujitsu-Siemens Slim Mobile USB DVB-T", NULL) },
1389 { DVB_USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2,
1390 &af9015_props, "Telestar Starstick 2", NULL) },
1391 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309,
1392 &af9015_props, "AVerMedia A309", NULL) },
1393 { DVB_USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III,
1394 &af9015_props, "MSI Digi VOX mini III", RC_MAP_MSI_DIGIVOX_III) },
1395 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U,
1396 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1397 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2,
1398 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1399 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3,
1400 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1401 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT,
1402 &af9015_props, "TrekStor DVB-T USB Stick", RC_MAP_TREKSTOR) },
1403 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850,
1404 &af9015_props, "AverMedia AVerTV Volar Black HD (A850)", NULL) },
1405 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805,
1406 &af9015_props, "AverMedia AVerTV Volar GPS 805 (A805)", NULL) },
1407 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU,
1408 &af9015_props, "Conceptronic USB2.0 DVB-T CTVDIGRCU V3.0", NULL) },
1409 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810,
1410 &af9015_props, "KWorld Digial MC-810", NULL) },
1411 { DVB_USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03,
1412 &af9015_props, "Genius TVGo DVB-T03", NULL) },
1413 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2,
1414 &af9015_props, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL) },
1415 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T,
1416 &af9015_props, "KWorld PlusTV DVB-T PCI Pro Card (DVB-T PC160-T)", NULL) },
1417 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20,
1418 &af9015_props, "Sveon STV20 Tuner USB DVB-T HDTV", NULL) },
1419 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2,
1420 &af9015_props, "DigitalNow TinyTwin v2", RC_MAP_DIGITALNOW_TINYTWIN) },
1421 { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS,
1422 &af9015_props, "Leadtek WinFast DTV2000DS", RC_MAP_LEADTEK_Y04G0051) },
1423 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T,
1424 &af9015_props, "KWorld USB DVB-T Stick Mobile (UB383-T)", NULL) },
1425 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4,
1426 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1427 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M,
1428 &af9015_props, "AverMedia AVerTV Volar M (A815Mac)", NULL) },
1429 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_RC,
1430 &af9015_props, "TerraTec Cinergy T Stick RC", RC_MAP_TERRATEC_SLIM_2) },
1431 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
1432 &af9015_props, "TerraTec Cinergy T Stick Dual RC", RC_MAP_TERRATEC_SLIM) },
1433 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T,
1434 &af9015_props, "AverMedia AVerTV Red HD+ (A850T)", NULL) },
1435 { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3,
1436 &af9015_props, "DigitalNow TinyTwin v3", RC_MAP_DIGITALNOW_TINYTWIN) },
1437 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22,
1438 &af9015_props, "Sveon STV22 Dual USB DVB-T Tuner HDTV", RC_MAP_MSI_DIGIVOX_III) },
1439 { }
1440};
1441MODULE_DEVICE_TABLE(usb, af9015_id_table);
Antti Palosaari80619de2008-09-15 17:18:09 -03001442
Antti Palosaari80619de2008-09-15 17:18:09 -03001443/* usb specific object needed to register this driver with the usb subsystem */
1444static struct usb_driver af9015_usb_driver = {
Antti Palosaaria3645e52012-06-07 20:36:35 -03001445 .name = KBUILD_MODNAME,
Antti Palosaari2d2b37c72012-06-12 01:05:20 -03001446 .id_table = af9015_id_table,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001447 .probe = dvb_usbv2_probe,
1448 .disconnect = dvb_usbv2_disconnect,
Antti Palosaari53dc1942012-06-12 02:20:01 -03001449 .suspend = dvb_usbv2_suspend,
1450 .resume = dvb_usbv2_resume,
Antti Palosaari04966aa2012-08-14 22:21:08 -03001451 .reset_resume = dvb_usbv2_reset_resume,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001452 .no_dynamic_id = 1,
Antti Palosaari77f54512012-06-09 21:22:06 -03001453 .soft_unbind = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001454};
1455
Greg Kroah-Hartmanecb3b2b2011-11-18 09:46:12 -08001456module_usb_driver(af9015_usb_driver);
Antti Palosaari80619de2008-09-15 17:18:09 -03001457
1458MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
Antti Palosaaribc050e62012-05-08 06:04:24 -03001459MODULE_DESCRIPTION("Afatech AF9015 driver");
Antti Palosaari80619de2008-09-15 17:18:09 -03001460MODULE_LICENSE("GPL");
Antti Palosaaribab9b4f2012-09-12 11:37:25 -03001461MODULE_FIRMWARE(AF9015_FIRMWARE);