Use dentry_path() to create full path to inode object
[pohmelfs.git] / drivers / media / dvb / dvb-usb / af9015.c
blob282a43d648df1817ec0d86ef4adf995706af52cf
1 /*
2 * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
6 * Thanks to Afatech who kindly provided information.
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.
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.
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.
24 #include <linux/hash.h>
25 #include <linux/slab.h>
27 #include "af9015.h"
28 #include "af9013.h"
29 #include "mt2060.h"
30 #include "qt1010.h"
31 #include "tda18271.h"
32 #include "mxl5005s.h"
33 #include "mc44s803.h"
34 #include "tda18218.h"
35 #include "mxl5007t.h"
37 static int dvb_usb_af9015_debug;
38 module_param_named(debug, dvb_usb_af9015_debug, int, 0644);
39 MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
40 static int dvb_usb_af9015_remote;
41 module_param_named(remote, dvb_usb_af9015_remote, int, 0644);
42 MODULE_PARM_DESC(remote, "select remote");
43 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
45 static DEFINE_MUTEX(af9015_usb_mutex);
47 static struct af9015_config af9015_config;
48 static struct dvb_usb_device_properties af9015_properties[3];
49 static int af9015_properties_count = ARRAY_SIZE(af9015_properties);
51 static struct af9013_config af9015_af9013_config[] = {
53 .i2c_addr = AF9015_I2C_DEMOD,
54 .ts_mode = AF9013_TS_USB,
55 .api_version = { 0, 1, 9, 0 },
56 .gpio[0] = AF9013_GPIO_HI,
57 .gpio[3] = AF9013_GPIO_TUNER_ON,
59 }, {
60 .ts_mode = AF9013_TS_SERIAL,
61 .api_version = { 0, 1, 9, 0 },
62 .gpio[0] = AF9013_GPIO_TUNER_ON,
63 .gpio[1] = AF9013_GPIO_LO,
67 static int af9015_rw_udev(struct usb_device *udev, struct req_t *req)
69 #define BUF_LEN 63
70 #define REQ_HDR_LEN 8 /* send header size */
71 #define ACK_HDR_LEN 2 /* rece header size */
72 int act_len, ret;
73 u8 buf[BUF_LEN];
74 u8 write = 1;
75 u8 msg_len = REQ_HDR_LEN;
76 static u8 seq; /* packet sequence number */
78 if (mutex_lock_interruptible(&af9015_usb_mutex) < 0)
79 return -EAGAIN;
81 buf[0] = req->cmd;
82 buf[1] = seq++;
83 buf[2] = req->i2c_addr;
84 buf[3] = req->addr >> 8;
85 buf[4] = req->addr & 0xff;
86 buf[5] = req->mbox;
87 buf[6] = req->addr_len;
88 buf[7] = req->data_len;
90 switch (req->cmd) {
91 case GET_CONFIG:
92 case READ_MEMORY:
93 case RECONNECT_USB:
94 write = 0;
95 break;
96 case READ_I2C:
97 write = 0;
98 buf[2] |= 0x01; /* set I2C direction */
99 case WRITE_I2C:
100 buf[0] = READ_WRITE_I2C;
101 break;
102 case WRITE_MEMORY:
103 if (((req->addr & 0xff00) == 0xff00) ||
104 ((req->addr & 0xff00) == 0xae00))
105 buf[0] = WRITE_VIRTUAL_MEMORY;
106 case WRITE_VIRTUAL_MEMORY:
107 case COPY_FIRMWARE:
108 case DOWNLOAD_FIRMWARE:
109 case BOOT:
110 break;
111 default:
112 err("unknown command:%d", req->cmd);
113 ret = -1;
114 goto error_unlock;
117 /* buffer overflow check */
118 if ((write && (req->data_len > BUF_LEN - REQ_HDR_LEN)) ||
119 (!write && (req->data_len > BUF_LEN - ACK_HDR_LEN))) {
120 err("too much data; cmd:%d len:%d", req->cmd, req->data_len);
121 ret = -EINVAL;
122 goto error_unlock;
125 /* write requested */
126 if (write) {
127 memcpy(&buf[REQ_HDR_LEN], req->data, req->data_len);
128 msg_len += req->data_len;
131 deb_xfer(">>> ");
132 debug_dump(buf, msg_len, deb_xfer);
134 /* send req */
135 ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x02), buf, msg_len,
136 &act_len, AF9015_USB_TIMEOUT);
137 if (ret)
138 err("bulk message failed:%d (%d/%d)", ret, msg_len, act_len);
139 else
140 if (act_len != msg_len)
141 ret = -1; /* all data is not send */
142 if (ret)
143 goto error_unlock;
145 /* no ack for those packets */
146 if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB)
147 goto exit_unlock;
149 /* write receives seq + status = 2 bytes
150 read receives seq + status + data = 2 + N bytes */
151 msg_len = ACK_HDR_LEN;
152 if (!write)
153 msg_len += req->data_len;
155 ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, 0x81), buf, msg_len,
156 &act_len, AF9015_USB_TIMEOUT);
157 if (ret) {
158 err("recv bulk message failed:%d", ret);
159 ret = -1;
160 goto error_unlock;
163 deb_xfer("<<< ");
164 debug_dump(buf, act_len, deb_xfer);
166 /* check status */
167 if (buf[1]) {
168 err("command failed:%d", buf[1]);
169 ret = -1;
170 goto error_unlock;
173 /* read request, copy returned data to return buf */
174 if (!write)
175 memcpy(req->data, &buf[ACK_HDR_LEN], req->data_len);
177 error_unlock:
178 exit_unlock:
179 mutex_unlock(&af9015_usb_mutex);
181 return ret;
184 static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req)
186 return af9015_rw_udev(d->udev, req);
189 static int af9015_write_regs(struct dvb_usb_device *d, u16 addr, u8 *val,
190 u8 len)
192 struct req_t req = {WRITE_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
193 val};
194 return af9015_ctrl_msg(d, &req);
197 static int af9015_write_reg(struct dvb_usb_device *d, u16 addr, u8 val)
199 return af9015_write_regs(d, addr, &val, 1);
202 static int af9015_read_regs(struct dvb_usb_device *d, u16 addr, u8 *val, u8 len)
204 struct req_t req = {READ_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
205 val};
206 return af9015_ctrl_msg(d, &req);
209 static int af9015_read_reg(struct dvb_usb_device *d, u16 addr, u8 *val)
211 return af9015_read_regs(d, addr, val, 1);
214 static int af9015_write_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
215 u8 val)
217 struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val};
219 if (addr == af9015_af9013_config[0].i2c_addr ||
220 addr == af9015_af9013_config[1].i2c_addr)
221 req.addr_len = 3;
223 return af9015_ctrl_msg(d, &req);
226 static int af9015_read_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
227 u8 *val)
229 struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val};
231 if (addr == af9015_af9013_config[0].i2c_addr ||
232 addr == af9015_af9013_config[1].i2c_addr)
233 req.addr_len = 3;
235 return af9015_ctrl_msg(d, &req);
238 static int af9015_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
239 int num)
241 struct dvb_usb_device *d = i2c_get_adapdata(adap);
242 int ret = 0, i = 0;
243 u16 addr;
244 u8 uninitialized_var(mbox), addr_len;
245 struct req_t req;
247 /* TODO: implement bus lock
249 The bus lock is needed because there is two tuners both using same I2C-address.
250 Due to that the only way to select correct tuner is use demodulator I2C-gate.
252 ................................................
253 . AF9015 includes integrated AF9013 demodulator.
254 . ____________ ____________ . ____________
255 .| uC | | demod | . | tuner |
256 .|------------| |------------| . |------------|
257 .| AF9015 | | AF9013/5 | . | MXL5003 |
258 .| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
259 .| | | | addr 0x38 | . | addr 0xc6 |
260 .|____________| | |____________| . |____________|
261 .................|..............................
262 | ____________ ____________
263 | | demod | | tuner |
264 | |------------| |------------|
265 | | AF9013 | | MXL5003 |
266 +----I2C-------|-----/ -----|-------I2C-------| |
267 | addr 0x3a | | addr 0xc6 |
268 |____________| |____________|
270 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
271 return -EAGAIN;
273 while (i < num) {
274 if (msg[i].addr == af9015_af9013_config[0].i2c_addr ||
275 msg[i].addr == af9015_af9013_config[1].i2c_addr) {
276 addr = msg[i].buf[0] << 8;
277 addr += msg[i].buf[1];
278 mbox = msg[i].buf[2];
279 addr_len = 3;
280 } else {
281 addr = msg[i].buf[0];
282 addr_len = 1;
283 /* mbox is don't care in that case */
286 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
287 if (msg[i].len > 3 || msg[i+1].len > 61) {
288 ret = -EOPNOTSUPP;
289 goto error;
291 if (msg[i].addr == af9015_af9013_config[0].i2c_addr)
292 req.cmd = READ_MEMORY;
293 else
294 req.cmd = READ_I2C;
295 req.i2c_addr = msg[i].addr;
296 req.addr = addr;
297 req.mbox = mbox;
298 req.addr_len = addr_len;
299 req.data_len = msg[i+1].len;
300 req.data = &msg[i+1].buf[0];
301 ret = af9015_ctrl_msg(d, &req);
302 i += 2;
303 } else if (msg[i].flags & I2C_M_RD) {
304 if (msg[i].len > 61) {
305 ret = -EOPNOTSUPP;
306 goto error;
308 if (msg[i].addr ==
309 af9015_af9013_config[0].i2c_addr) {
310 ret = -EINVAL;
311 goto error;
313 req.cmd = READ_I2C;
314 req.i2c_addr = msg[i].addr;
315 req.addr = addr;
316 req.mbox = mbox;
317 req.addr_len = addr_len;
318 req.data_len = msg[i].len;
319 req.data = &msg[i].buf[0];
320 ret = af9015_ctrl_msg(d, &req);
321 i += 1;
322 } else {
323 if (msg[i].len > 21) {
324 ret = -EOPNOTSUPP;
325 goto error;
327 if (msg[i].addr == af9015_af9013_config[0].i2c_addr)
328 req.cmd = WRITE_MEMORY;
329 else
330 req.cmd = WRITE_I2C;
331 req.i2c_addr = msg[i].addr;
332 req.addr = addr;
333 req.mbox = mbox;
334 req.addr_len = addr_len;
335 req.data_len = msg[i].len-addr_len;
336 req.data = &msg[i].buf[addr_len];
337 ret = af9015_ctrl_msg(d, &req);
338 i += 1;
340 if (ret)
341 goto error;
344 ret = i;
346 error:
347 mutex_unlock(&d->i2c_mutex);
349 return ret;
352 static u32 af9015_i2c_func(struct i2c_adapter *adapter)
354 return I2C_FUNC_I2C;
357 static struct i2c_algorithm af9015_i2c_algo = {
358 .master_xfer = af9015_i2c_xfer,
359 .functionality = af9015_i2c_func,
362 static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op)
364 int ret;
365 u8 val, mask = 0x01;
367 ret = af9015_read_reg(d, addr, &val);
368 if (ret)
369 return ret;
371 mask <<= bit;
372 if (op) {
373 /* set bit */
374 val |= mask;
375 } else {
376 /* clear bit */
377 mask ^= 0xff;
378 val &= mask;
381 return af9015_write_reg(d, addr, val);
384 static int af9015_set_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
386 return af9015_do_reg_bit(d, addr, bit, 1);
389 static int af9015_clear_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
391 return af9015_do_reg_bit(d, addr, bit, 0);
394 static int af9015_init_endpoint(struct dvb_usb_device *d)
396 int ret;
397 u16 frame_size;
398 u8 packet_size;
399 deb_info("%s: USB speed:%d\n", __func__, d->udev->speed);
401 /* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0.
402 We use smaller - about 1/4 from the original, 5 and 87. */
403 #define TS_PACKET_SIZE 188
405 #define TS_USB20_PACKET_COUNT 87
406 #define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT)
408 #define TS_USB11_PACKET_COUNT 5
409 #define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT)
411 #define TS_USB20_MAX_PACKET_SIZE 512
412 #define TS_USB11_MAX_PACKET_SIZE 64
414 if (d->udev->speed == USB_SPEED_FULL) {
415 frame_size = TS_USB11_FRAME_SIZE/4;
416 packet_size = TS_USB11_MAX_PACKET_SIZE/4;
417 } else {
418 frame_size = TS_USB20_FRAME_SIZE/4;
419 packet_size = TS_USB20_MAX_PACKET_SIZE/4;
422 ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
423 if (ret)
424 goto error;
425 ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
426 if (ret)
427 goto error;
428 ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
429 if (ret)
430 goto error;
431 ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
432 if (ret)
433 goto error;
434 ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
435 if (ret)
436 goto error;
437 if (af9015_config.dual_mode) {
438 ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
439 if (ret)
440 goto error;
442 ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
443 if (ret)
444 goto error;
445 if (af9015_config.dual_mode) {
446 ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
447 if (ret)
448 goto error;
450 /* EP4 xfer length */
451 ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
452 if (ret)
453 goto error;
454 ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
455 if (ret)
456 goto error;
457 /* EP5 xfer length */
458 ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
459 if (ret)
460 goto error;
461 ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
462 if (ret)
463 goto error;
464 ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
465 if (ret)
466 goto error;
467 ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
468 if (ret)
469 goto error;
470 ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
471 if (ret)
472 goto error;
473 if (af9015_config.dual_mode) {
474 ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
475 if (ret)
476 goto error;
479 /* enable / disable mp2if2 */
480 if (af9015_config.dual_mode)
481 ret = af9015_set_reg_bit(d, 0xd50b, 0);
482 else
483 ret = af9015_clear_reg_bit(d, 0xd50b, 0);
485 error:
486 if (ret)
487 err("endpoint init failed:%d", ret);
488 return ret;
491 static int af9015_copy_firmware(struct dvb_usb_device *d)
493 int ret;
494 u8 fw_params[4];
495 u8 val, i;
496 struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
497 fw_params };
498 deb_info("%s:\n", __func__);
500 fw_params[0] = af9015_config.firmware_size >> 8;
501 fw_params[1] = af9015_config.firmware_size & 0xff;
502 fw_params[2] = af9015_config.firmware_checksum >> 8;
503 fw_params[3] = af9015_config.firmware_checksum & 0xff;
505 /* wait 2nd demodulator ready */
506 msleep(100);
508 ret = af9015_read_reg_i2c(d,
509 af9015_af9013_config[1].i2c_addr, 0x98be, &val);
510 if (ret)
511 goto error;
512 else
513 deb_info("%s: firmware status:%02x\n", __func__, val);
515 if (val == 0x0c) /* fw is running, no need for download */
516 goto exit;
518 /* set I2C master clock to fast (to speed up firmware copy) */
519 ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
520 if (ret)
521 goto error;
523 msleep(50);
525 /* copy firmware */
526 ret = af9015_ctrl_msg(d, &req);
527 if (ret)
528 err("firmware copy cmd failed:%d", ret);
529 deb_info("%s: firmware copy done\n", __func__);
531 /* set I2C master clock back to normal */
532 ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
533 if (ret)
534 goto error;
536 /* request boot firmware */
537 ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].i2c_addr,
538 0xe205, 1);
539 deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
540 if (ret)
541 goto error;
543 for (i = 0; i < 15; i++) {
544 msleep(100);
546 /* check firmware status */
547 ret = af9015_read_reg_i2c(d,
548 af9015_af9013_config[1].i2c_addr, 0x98be, &val);
549 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
550 __func__, ret, val);
551 if (ret)
552 goto error;
554 if (val == 0x0c || val == 0x04) /* success or fail */
555 break;
558 if (val == 0x04) {
559 err("firmware did not run");
560 ret = -1;
561 } else if (val != 0x0c) {
562 err("firmware boot timeout");
563 ret = -1;
566 error:
567 exit:
568 return ret;
571 /* hash (and dump) eeprom */
572 static int af9015_eeprom_hash(struct usb_device *udev)
574 static const unsigned int eeprom_size = 256;
575 unsigned int reg;
576 int ret;
577 u8 val, *eeprom;
578 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
580 eeprom = kmalloc(eeprom_size, GFP_KERNEL);
581 if (eeprom == NULL)
582 return -ENOMEM;
584 for (reg = 0; reg < eeprom_size; reg++) {
585 req.addr = reg;
586 ret = af9015_rw_udev(udev, &req);
587 if (ret)
588 goto free;
589 eeprom[reg] = val;
592 if (dvb_usb_af9015_debug & 0x01)
593 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, eeprom,
594 eeprom_size);
596 BUG_ON(eeprom_size % 4);
598 af9015_config.eeprom_sum = 0;
599 for (reg = 0; reg < eeprom_size / sizeof(u32); reg++) {
600 af9015_config.eeprom_sum *= GOLDEN_RATIO_PRIME_32;
601 af9015_config.eeprom_sum += le32_to_cpu(((u32 *)eeprom)[reg]);
604 deb_info("%s: eeprom sum=%.8x\n", __func__, af9015_config.eeprom_sum);
606 ret = 0;
607 free:
608 kfree(eeprom);
609 return ret;
612 static int af9015_init(struct dvb_usb_device *d)
614 int ret;
615 deb_info("%s:\n", __func__);
617 /* init RC canary */
618 ret = af9015_write_reg(d, 0x98e9, 0xff);
619 if (ret)
620 goto error;
622 ret = af9015_init_endpoint(d);
623 if (ret)
624 goto error;
626 error:
627 return ret;
630 static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
632 int ret;
633 deb_info("%s: onoff:%d\n", __func__, onoff);
635 if (onoff)
636 ret = af9015_set_reg_bit(adap->dev, 0xd503, 0);
637 else
638 ret = af9015_clear_reg_bit(adap->dev, 0xd503, 0);
640 return ret;
643 static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
644 int onoff)
646 int ret;
647 u8 idx;
649 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
650 __func__, index, pid, onoff);
652 ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
653 if (ret)
654 goto error;
656 ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
657 if (ret)
658 goto error;
660 idx = ((index & 0x1f) | (1 << 5));
661 ret = af9015_write_reg(adap->dev, 0xd504, idx);
663 error:
664 return ret;
667 static int af9015_download_firmware(struct usb_device *udev,
668 const struct firmware *fw)
670 int i, len, remaining, ret;
671 struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL};
672 u16 checksum = 0;
674 deb_info("%s:\n", __func__);
676 /* calc checksum */
677 for (i = 0; i < fw->size; i++)
678 checksum += fw->data[i];
680 af9015_config.firmware_size = fw->size;
681 af9015_config.firmware_checksum = checksum;
683 #define FW_ADDR 0x5100 /* firmware start address */
684 #define LEN_MAX 55 /* max packet size */
685 for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) {
686 len = remaining;
687 if (len > LEN_MAX)
688 len = LEN_MAX;
690 req.data_len = len;
691 req.data = (u8 *) &fw->data[fw->size - remaining];
692 req.addr = FW_ADDR + fw->size - remaining;
694 ret = af9015_rw_udev(udev, &req);
695 if (ret) {
696 err("firmware download failed:%d", ret);
697 goto error;
701 /* firmware loaded, request boot */
702 req.cmd = BOOT;
703 ret = af9015_rw_udev(udev, &req);
704 if (ret) {
705 err("firmware boot failed:%d", ret);
706 goto error;
709 error:
710 return ret;
713 struct af9015_rc_setup {
714 unsigned int id;
715 char *rc_codes;
718 static char *af9015_rc_setup_match(unsigned int id,
719 const struct af9015_rc_setup *table)
721 for (; table->rc_codes; table++)
722 if (table->id == id)
723 return table->rc_codes;
724 return NULL;
727 static const struct af9015_rc_setup af9015_rc_setup_modparam[] = {
728 { AF9015_REMOTE_A_LINK_DTU_M, RC_MAP_ALINK_DTU_M },
729 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, RC_MAP_MSI_DIGIVOX_II },
730 { AF9015_REMOTE_MYGICTV_U718, RC_MAP_TOTAL_MEDIA_IN_HAND },
731 { AF9015_REMOTE_DIGITTRADE_DVB_T, RC_MAP_DIGITTRADE },
732 { AF9015_REMOTE_AVERMEDIA_KS, RC_MAP_AVERMEDIA_RM_KS },
736 static const struct af9015_rc_setup af9015_rc_setup_hashes[] = {
737 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II },
738 { 0xa3703d00, RC_MAP_ALINK_DTU_M },
739 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND }, /* MYGICTV U718 */
740 { 0x5d49e3db, RC_MAP_DIGITTRADE }, /* LC-Power LC-USB-DVBT */
744 static const struct af9015_rc_setup af9015_rc_setup_usbids[] = {
745 { (USB_VID_TERRATEC << 16) | USB_PID_TERRATEC_CINERGY_T_STICK_RC,
746 RC_MAP_TERRATEC_SLIM_2 },
747 { (USB_VID_TERRATEC << 16) | USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
748 RC_MAP_TERRATEC_SLIM },
749 { (USB_VID_VISIONPLUS << 16) | USB_PID_AZUREWAVE_AD_TU700,
750 RC_MAP_AZUREWAVE_AD_TU700 },
751 { (USB_VID_VISIONPLUS << 16) | USB_PID_TINYTWIN,
752 RC_MAP_AZUREWAVE_AD_TU700 },
753 { (USB_VID_MSI_2 << 16) | USB_PID_MSI_DIGI_VOX_MINI_III,
754 RC_MAP_MSI_DIGIVOX_III },
755 { (USB_VID_MSI_2 << 16) | USB_PID_MSI_DIGIVOX_DUO,
756 RC_MAP_MSI_DIGIVOX_III },
757 { (USB_VID_LEADTEK << 16) | USB_PID_WINFAST_DTV_DONGLE_GOLD,
758 RC_MAP_LEADTEK_Y04G0051 },
759 { (USB_VID_LEADTEK << 16) | USB_PID_WINFAST_DTV2000DS,
760 RC_MAP_LEADTEK_Y04G0051 },
761 { (USB_VID_AVERMEDIA << 16) | USB_PID_AVERMEDIA_VOLAR_X,
762 RC_MAP_AVERMEDIA_M135A },
763 { (USB_VID_AFATECH << 16) | USB_PID_TREKSTOR_DVBT,
764 RC_MAP_TREKSTOR },
765 { (USB_VID_KWORLD_2 << 16) | USB_PID_TINYTWIN_2,
766 RC_MAP_DIGITALNOW_TINYTWIN },
767 { (USB_VID_GTEK << 16) | USB_PID_TINYTWIN_3,
768 RC_MAP_DIGITALNOW_TINYTWIN },
769 { (USB_VID_KWORLD_2 << 16) | USB_PID_SVEON_STV22,
770 RC_MAP_MSI_DIGIVOX_III },
774 static void af9015_set_remote_config(struct usb_device *udev,
775 struct dvb_usb_device_properties *props)
777 u16 vid = le16_to_cpu(udev->descriptor.idVendor);
778 u16 pid = le16_to_cpu(udev->descriptor.idProduct);
780 /* try to load remote based module param */
781 props->rc.core.rc_codes = af9015_rc_setup_match(
782 dvb_usb_af9015_remote, af9015_rc_setup_modparam);
784 /* try to load remote based eeprom hash */
785 if (!props->rc.core.rc_codes)
786 props->rc.core.rc_codes = af9015_rc_setup_match(
787 af9015_config.eeprom_sum, af9015_rc_setup_hashes);
789 /* try to load remote based USB ID */
790 if (!props->rc.core.rc_codes)
791 props->rc.core.rc_codes = af9015_rc_setup_match(
792 (vid << 16) + pid, af9015_rc_setup_usbids);
794 /* try to load remote based USB iManufacturer string */
795 if (!props->rc.core.rc_codes && vid == USB_VID_AFATECH) {
796 /* Check USB manufacturer and product strings and try
797 to determine correct remote in case of chip vendor
798 reference IDs are used.
799 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
800 char manufacturer[10];
801 memset(manufacturer, 0, sizeof(manufacturer));
802 usb_string(udev, udev->descriptor.iManufacturer,
803 manufacturer, sizeof(manufacturer));
804 if (!strcmp("MSI", manufacturer)) {
805 /* iManufacturer 1 MSI
806 iProduct 2 MSI K-VOX */
807 props->rc.core.rc_codes = af9015_rc_setup_match(
808 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
809 af9015_rc_setup_modparam);
813 /* finally load "empty" just for leaving IR receiver enabled */
814 if (!props->rc.core.rc_codes)
815 props->rc.core.rc_codes = RC_MAP_EMPTY;
817 return;
820 static int af9015_read_config(struct usb_device *udev)
822 int ret;
823 u8 val, i, offset = 0;
824 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
826 /* IR remote controller */
827 req.addr = AF9015_EEPROM_IR_MODE;
828 /* first message will timeout often due to possible hw bug */
829 for (i = 0; i < 4; i++) {
830 ret = af9015_rw_udev(udev, &req);
831 if (!ret)
832 break;
834 if (ret)
835 goto error;
837 ret = af9015_eeprom_hash(udev);
838 if (ret)
839 goto error;
841 deb_info("%s: IR mode=%d\n", __func__, val);
842 for (i = 0; i < af9015_properties_count; i++) {
843 if (val == AF9015_IR_MODE_DISABLED)
844 af9015_properties[i].rc.core.rc_codes = NULL;
845 else
846 af9015_set_remote_config(udev, &af9015_properties[i]);
849 /* TS mode - one or two receivers */
850 req.addr = AF9015_EEPROM_TS_MODE;
851 ret = af9015_rw_udev(udev, &req);
852 if (ret)
853 goto error;
854 af9015_config.dual_mode = val;
855 deb_info("%s: TS mode=%d\n", __func__, af9015_config.dual_mode);
857 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
858 size can be static because it is enabled only USB2.0 */
859 for (i = 0; i < af9015_properties_count; i++) {
860 /* USB1.1 set smaller buffersize and disable 2nd adapter */
861 if (udev->speed == USB_SPEED_FULL) {
862 af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
863 = TS_USB11_FRAME_SIZE;
864 /* disable 2nd adapter because we don't have
865 PID-filters */
866 af9015_config.dual_mode = 0;
867 } else {
868 af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
869 = TS_USB20_FRAME_SIZE;
873 if (af9015_config.dual_mode) {
874 /* read 2nd demodulator I2C address */
875 req.addr = AF9015_EEPROM_DEMOD2_I2C;
876 ret = af9015_rw_udev(udev, &req);
877 if (ret)
878 goto error;
879 af9015_af9013_config[1].i2c_addr = val;
881 /* enable 2nd adapter */
882 for (i = 0; i < af9015_properties_count; i++)
883 af9015_properties[i].num_adapters = 2;
885 } else {
886 /* disable 2nd adapter */
887 for (i = 0; i < af9015_properties_count; i++)
888 af9015_properties[i].num_adapters = 1;
891 for (i = 0; i < af9015_properties[0].num_adapters; i++) {
892 if (i == 1)
893 offset = AF9015_EEPROM_OFFSET;
894 /* xtal */
895 req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
896 ret = af9015_rw_udev(udev, &req);
897 if (ret)
898 goto error;
899 switch (val) {
900 case 0:
901 af9015_af9013_config[i].clock = 28800000;
902 break;
903 case 1:
904 af9015_af9013_config[i].clock = 20480000;
905 break;
906 case 2:
907 af9015_af9013_config[i].clock = 28000000;
908 break;
909 case 3:
910 af9015_af9013_config[i].clock = 25000000;
911 break;
913 deb_info("%s: [%d] xtal=%d set clock=%d\n", __func__, i,
914 val, af9015_af9013_config[i].clock);
916 /* IF frequency */
917 req.addr = AF9015_EEPROM_IF1H + offset;
918 ret = af9015_rw_udev(udev, &req);
919 if (ret)
920 goto error;
922 af9015_af9013_config[i].if_frequency = val << 8;
924 req.addr = AF9015_EEPROM_IF1L + offset;
925 ret = af9015_rw_udev(udev, &req);
926 if (ret)
927 goto error;
929 af9015_af9013_config[i].if_frequency += val;
930 af9015_af9013_config[i].if_frequency *= 1000;
931 deb_info("%s: [%d] IF frequency=%d\n", __func__, i,
932 af9015_af9013_config[0].if_frequency);
934 /* MT2060 IF1 */
935 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
936 ret = af9015_rw_udev(udev, &req);
937 if (ret)
938 goto error;
939 af9015_config.mt2060_if1[i] = val << 8;
940 req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
941 ret = af9015_rw_udev(udev, &req);
942 if (ret)
943 goto error;
944 af9015_config.mt2060_if1[i] += val;
945 deb_info("%s: [%d] MT2060 IF1=%d\n", __func__, i,
946 af9015_config.mt2060_if1[i]);
948 /* tuner */
949 req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
950 ret = af9015_rw_udev(udev, &req);
951 if (ret)
952 goto error;
953 switch (val) {
954 case AF9013_TUNER_ENV77H11D5:
955 case AF9013_TUNER_MT2060:
956 case AF9013_TUNER_QT1010:
957 case AF9013_TUNER_UNKNOWN:
958 case AF9013_TUNER_MT2060_2:
959 case AF9013_TUNER_TDA18271:
960 case AF9013_TUNER_QT1010A:
961 case AF9013_TUNER_TDA18218:
962 af9015_af9013_config[i].spec_inv = 1;
963 break;
964 case AF9013_TUNER_MXL5003D:
965 case AF9013_TUNER_MXL5005D:
966 case AF9013_TUNER_MXL5005R:
967 case AF9013_TUNER_MXL5007T:
968 af9015_af9013_config[i].spec_inv = 0;
969 break;
970 case AF9013_TUNER_MC44S803:
971 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
972 af9015_af9013_config[i].spec_inv = 1;
973 break;
974 default:
975 warn("tuner id=%d not supported, please report!", val);
976 return -ENODEV;
979 af9015_af9013_config[i].tuner = val;
980 deb_info("%s: [%d] tuner id=%d\n", __func__, i, val);
983 error:
984 if (ret)
985 err("eeprom read failed=%d", ret);
987 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
988 content :-( Override some wrong values here. Ditto for the
989 AVerTV Red HD+ (A850T) device. */
990 if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
991 ((le16_to_cpu(udev->descriptor.idProduct) ==
992 USB_PID_AVERMEDIA_A850) ||
993 (le16_to_cpu(udev->descriptor.idProduct) ==
994 USB_PID_AVERMEDIA_A850T))) {
995 deb_info("%s: AverMedia A850: overriding config\n", __func__);
996 /* disable dual mode */
997 af9015_config.dual_mode = 0;
998 /* disable 2nd adapter */
999 for (i = 0; i < af9015_properties_count; i++)
1000 af9015_properties[i].num_adapters = 1;
1002 /* set correct IF */
1003 af9015_af9013_config[0].if_frequency = 4570000;
1006 return ret;
1009 static int af9015_identify_state(struct usb_device *udev,
1010 struct dvb_usb_device_properties *props,
1011 struct dvb_usb_device_description **desc,
1012 int *cold)
1014 int ret;
1015 u8 reply;
1016 struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
1018 ret = af9015_rw_udev(udev, &req);
1019 if (ret)
1020 return ret;
1022 deb_info("%s: reply:%02x\n", __func__, reply);
1023 if (reply == 0x02)
1024 *cold = 0;
1025 else
1026 *cold = 1;
1028 return ret;
1031 static int af9015_rc_query(struct dvb_usb_device *d)
1033 struct af9015_state *priv = d->priv;
1034 int ret;
1035 u8 buf[17];
1037 /* read registers needed to detect remote controller code */
1038 ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
1039 if (ret)
1040 goto error;
1042 /* If any of these are non-zero, assume invalid data */
1043 if (buf[1] || buf[2] || buf[3])
1044 return ret;
1046 /* Check for repeat of previous code */
1047 if ((priv->rc_repeat != buf[6] || buf[0]) &&
1048 !memcmp(&buf[12], priv->rc_last, 4)) {
1049 deb_rc("%s: key repeated\n", __func__);
1050 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1051 priv->rc_repeat = buf[6];
1052 return ret;
1055 /* Only process key if canary killed */
1056 if (buf[16] != 0xff && buf[0] != 0x01) {
1057 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
1058 buf[12], buf[13], buf[14], buf[15]);
1060 /* Reset the canary */
1061 ret = af9015_write_reg(d, 0x98e9, 0xff);
1062 if (ret)
1063 goto error;
1065 /* Remember this key */
1066 memcpy(priv->rc_last, &buf[12], 4);
1067 if (buf[14] == (u8) ~buf[15]) {
1068 if (buf[12] == (u8) ~buf[13]) {
1069 /* NEC */
1070 priv->rc_keycode = buf[12] << 8 | buf[14];
1071 } else {
1072 /* NEC extended*/
1073 priv->rc_keycode = buf[12] << 16 |
1074 buf[13] << 8 | buf[14];
1076 } else {
1077 /* 32 bit NEC */
1078 priv->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1079 buf[14] << 8 | buf[15];
1081 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1082 } else {
1083 deb_rc("%s: no key press\n", __func__);
1084 /* Invalidate last keypress */
1085 /* Not really needed, but helps with debug */
1086 priv->rc_last[2] = priv->rc_last[3];
1089 priv->rc_repeat = buf[6];
1091 error:
1092 if (ret)
1093 err("%s: failed:%d", __func__, ret);
1095 return ret;
1098 /* override demod callbacks for resource locking */
1099 static int af9015_af9013_set_frontend(struct dvb_frontend *fe)
1101 int ret;
1102 struct dvb_usb_adapter *adap = fe->dvb->priv;
1103 struct af9015_state *priv = adap->dev->priv;
1105 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1106 return -EAGAIN;
1108 ret = priv->set_frontend[adap->id](fe);
1110 mutex_unlock(&adap->dev->usb_mutex);
1112 return ret;
1115 /* override demod callbacks for resource locking */
1116 static int af9015_af9013_read_status(struct dvb_frontend *fe,
1117 fe_status_t *status)
1119 int ret;
1120 struct dvb_usb_adapter *adap = fe->dvb->priv;
1121 struct af9015_state *priv = adap->dev->priv;
1123 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1124 return -EAGAIN;
1126 ret = priv->read_status[adap->id](fe, status);
1128 mutex_unlock(&adap->dev->usb_mutex);
1130 return ret;
1133 /* override demod callbacks for resource locking */
1134 static int af9015_af9013_init(struct dvb_frontend *fe)
1136 int ret;
1137 struct dvb_usb_adapter *adap = fe->dvb->priv;
1138 struct af9015_state *priv = adap->dev->priv;
1140 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1141 return -EAGAIN;
1143 ret = priv->init[adap->id](fe);
1145 mutex_unlock(&adap->dev->usb_mutex);
1147 return ret;
1150 /* override demod callbacks for resource locking */
1151 static int af9015_af9013_sleep(struct dvb_frontend *fe)
1153 int ret;
1154 struct dvb_usb_adapter *adap = fe->dvb->priv;
1155 struct af9015_state *priv = adap->dev->priv;
1157 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1158 return -EAGAIN;
1160 ret = priv->sleep[adap->id](fe);
1162 mutex_unlock(&adap->dev->usb_mutex);
1164 return ret;
1167 static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1169 int ret;
1170 struct af9015_state *state = adap->dev->priv;
1172 if (adap->id == 1) {
1173 /* copy firmware to 2nd demodulator */
1174 if (af9015_config.dual_mode) {
1175 ret = af9015_copy_firmware(adap->dev);
1176 if (ret) {
1177 err("firmware copy to 2nd frontend " \
1178 "failed, will disable it");
1179 af9015_config.dual_mode = 0;
1180 return -ENODEV;
1182 } else {
1183 return -ENODEV;
1187 /* attach demodulator */
1188 adap->fe_adap[0].fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
1189 &adap->dev->i2c_adap);
1192 * AF9015 firmware does not like if it gets interrupted by I2C adapter
1193 * request on some critical phases. During normal operation I2C adapter
1194 * is used only 2nd demodulator and tuner on dual tuner devices.
1195 * Override demodulator callbacks and use mutex for limit access to
1196 * those "critical" paths to keep AF9015 happy.
1197 * Note: we abuse unused usb_mutex here.
1199 if (adap->fe_adap[0].fe) {
1200 state->set_frontend[adap->id] =
1201 adap->fe_adap[0].fe->ops.set_frontend;
1202 adap->fe_adap[0].fe->ops.set_frontend =
1203 af9015_af9013_set_frontend;
1205 state->read_status[adap->id] =
1206 adap->fe_adap[0].fe->ops.read_status;
1207 adap->fe_adap[0].fe->ops.read_status =
1208 af9015_af9013_read_status;
1210 state->init[adap->id] = adap->fe_adap[0].fe->ops.init;
1211 adap->fe_adap[0].fe->ops.init = af9015_af9013_init;
1213 state->sleep[adap->id] = adap->fe_adap[0].fe->ops.sleep;
1214 adap->fe_adap[0].fe->ops.sleep = af9015_af9013_sleep;
1217 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
1220 static struct mt2060_config af9015_mt2060_config = {
1221 .i2c_address = 0xc0,
1222 .clock_out = 0,
1225 static struct qt1010_config af9015_qt1010_config = {
1226 .i2c_address = 0xc4,
1229 static struct tda18271_config af9015_tda18271_config = {
1230 .gate = TDA18271_GATE_DIGITAL,
1231 .small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
1234 static struct mxl5005s_config af9015_mxl5003_config = {
1235 .i2c_address = 0xc6,
1236 .if_freq = IF_FREQ_4570000HZ,
1237 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1238 .agc_mode = MXL_SINGLE_AGC,
1239 .tracking_filter = MXL_TF_DEFAULT,
1240 .rssi_enable = MXL_RSSI_ENABLE,
1241 .cap_select = MXL_CAP_SEL_ENABLE,
1242 .div_out = MXL_DIV_OUT_4,
1243 .clock_out = MXL_CLOCK_OUT_DISABLE,
1244 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1245 .top = MXL5005S_TOP_25P2,
1246 .mod_mode = MXL_DIGITAL_MODE,
1247 .if_mode = MXL_ZERO_IF,
1248 .AgcMasterByte = 0x00,
1251 static struct mxl5005s_config af9015_mxl5005_config = {
1252 .i2c_address = 0xc6,
1253 .if_freq = IF_FREQ_4570000HZ,
1254 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1255 .agc_mode = MXL_SINGLE_AGC,
1256 .tracking_filter = MXL_TF_OFF,
1257 .rssi_enable = MXL_RSSI_ENABLE,
1258 .cap_select = MXL_CAP_SEL_ENABLE,
1259 .div_out = MXL_DIV_OUT_4,
1260 .clock_out = MXL_CLOCK_OUT_DISABLE,
1261 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1262 .top = MXL5005S_TOP_25P2,
1263 .mod_mode = MXL_DIGITAL_MODE,
1264 .if_mode = MXL_ZERO_IF,
1265 .AgcMasterByte = 0x00,
1268 static struct mc44s803_config af9015_mc44s803_config = {
1269 .i2c_address = 0xc0,
1270 .dig_out = 1,
1273 static struct tda18218_config af9015_tda18218_config = {
1274 .i2c_address = 0xc0,
1275 .i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
1278 static struct mxl5007t_config af9015_mxl5007t_config = {
1279 .xtal_freq_hz = MxL_XTAL_24_MHZ,
1280 .if_freq_hz = MxL_IF_4_57_MHZ,
1283 static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
1285 int ret;
1286 deb_info("%s:\n", __func__);
1288 switch (af9015_af9013_config[adap->id].tuner) {
1289 case AF9013_TUNER_MT2060:
1290 case AF9013_TUNER_MT2060_2:
1291 ret = dvb_attach(mt2060_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
1292 &af9015_mt2060_config,
1293 af9015_config.mt2060_if1[adap->id])
1294 == NULL ? -ENODEV : 0;
1295 break;
1296 case AF9013_TUNER_QT1010:
1297 case AF9013_TUNER_QT1010A:
1298 ret = dvb_attach(qt1010_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
1299 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
1300 break;
1301 case AF9013_TUNER_TDA18271:
1302 ret = dvb_attach(tda18271_attach, adap->fe_adap[0].fe, 0xc0,
1303 &adap->dev->i2c_adap,
1304 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
1305 break;
1306 case AF9013_TUNER_TDA18218:
1307 ret = dvb_attach(tda18218_attach, adap->fe_adap[0].fe,
1308 &adap->dev->i2c_adap,
1309 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
1310 break;
1311 case AF9013_TUNER_MXL5003D:
1312 ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
1313 &adap->dev->i2c_adap,
1314 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
1315 break;
1316 case AF9013_TUNER_MXL5005D:
1317 case AF9013_TUNER_MXL5005R:
1318 ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
1319 &adap->dev->i2c_adap,
1320 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
1321 break;
1322 case AF9013_TUNER_ENV77H11D5:
1323 ret = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0xc0,
1324 &adap->dev->i2c_adap,
1325 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
1326 break;
1327 case AF9013_TUNER_MC44S803:
1328 ret = dvb_attach(mc44s803_attach, adap->fe_adap[0].fe,
1329 &adap->dev->i2c_adap,
1330 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
1331 break;
1332 case AF9013_TUNER_MXL5007T:
1333 ret = dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
1334 &adap->dev->i2c_adap,
1335 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
1336 break;
1337 case AF9013_TUNER_UNKNOWN:
1338 default:
1339 ret = -ENODEV;
1340 err("Unknown tuner id:%d",
1341 af9015_af9013_config[adap->id].tuner);
1343 return ret;
1346 enum af9015_usb_table_entry {
1347 AFATECH_9015,
1348 AFATECH_9016,
1349 WINFAST_DTV_GOLD,
1350 PINNACLE_PCTV_71E,
1351 KWORLD_PLUSTV_399U,
1352 TINYTWIN,
1353 AZUREWAVE_TU700,
1354 TERRATEC_AF9015,
1355 KWORLD_PLUSTV_PC160,
1356 AVERTV_VOLAR_X,
1357 XTENSIONS_380U,
1358 MSI_DIGIVOX_DUO,
1359 AVERTV_VOLAR_X_REV2,
1360 TELESTAR_STARSTICK_2,
1361 AVERMEDIA_A309_USB,
1362 MSI_DIGIVOX_MINI_III,
1363 KWORLD_E396,
1364 KWORLD_E39B,
1365 KWORLD_E395,
1366 TREKSTOR_DVBT,
1367 AVERTV_A850,
1368 AVERTV_A805,
1369 CONCEPTRONIC_CTVDIGRCU,
1370 KWORLD_MC810,
1371 GENIUS_TVGO_DVB_T03,
1372 KWORLD_399U_2,
1373 KWORLD_PC160_T,
1374 SVEON_STV20,
1375 TINYTWIN_2,
1376 WINFAST_DTV2000DS,
1377 KWORLD_UB383_T,
1378 KWORLD_E39A,
1379 AVERMEDIA_A815M,
1380 CINERGY_T_STICK_RC,
1381 CINERGY_T_DUAL_RC,
1382 AVERTV_A850T,
1383 TINYTWIN_3,
1384 SVEON_STV22,
1387 static struct usb_device_id af9015_usb_table[] = {
1388 [AFATECH_9015] =
1389 {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015)},
1390 [AFATECH_9016] =
1391 {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016)},
1392 [WINFAST_DTV_GOLD] =
1393 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD)},
1394 [PINNACLE_PCTV_71E] =
1395 {USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E)},
1396 [KWORLD_PLUSTV_399U] =
1397 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U)},
1398 [TINYTWIN] = {USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TINYTWIN)},
1399 [AZUREWAVE_TU700] =
1400 {USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_AZUREWAVE_AD_TU700)},
1401 [TERRATEC_AF9015] = {USB_DEVICE(USB_VID_TERRATEC,
1402 USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2)},
1403 [KWORLD_PLUSTV_PC160] =
1404 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T)},
1405 [AVERTV_VOLAR_X] =
1406 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X)},
1407 [XTENSIONS_380U] =
1408 {USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380)},
1409 [MSI_DIGIVOX_DUO] =
1410 {USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO)},
1411 [AVERTV_VOLAR_X_REV2] =
1412 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2)},
1413 [TELESTAR_STARSTICK_2] =
1414 {USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2)},
1415 [AVERMEDIA_A309_USB] =
1416 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309)},
1417 [MSI_DIGIVOX_MINI_III] =
1418 {USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III)},
1419 [KWORLD_E396] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U)},
1420 [KWORLD_E39B] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)},
1421 [KWORLD_E395] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)},
1422 [TREKSTOR_DVBT] = {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)},
1423 [AVERTV_A850] = {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)},
1424 [AVERTV_A805] = {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)},
1425 [CONCEPTRONIC_CTVDIGRCU] =
1426 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)},
1427 [KWORLD_MC810] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
1428 [GENIUS_TVGO_DVB_T03] =
1429 {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
1430 [KWORLD_399U_2] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
1431 [KWORLD_PC160_T] =
1432 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)},
1433 [SVEON_STV20] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)},
1434 [TINYTWIN_2] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2)},
1435 [WINFAST_DTV2000DS] =
1436 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS)},
1437 [KWORLD_UB383_T] =
1438 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T)},
1439 [KWORLD_E39A] =
1440 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4)},
1441 [AVERMEDIA_A815M] =
1442 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M)},
1443 [CINERGY_T_STICK_RC] = {USB_DEVICE(USB_VID_TERRATEC,
1444 USB_PID_TERRATEC_CINERGY_T_STICK_RC)},
1445 [CINERGY_T_DUAL_RC] = {USB_DEVICE(USB_VID_TERRATEC,
1446 USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC)},
1447 [AVERTV_A850T] =
1448 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T)},
1449 [TINYTWIN_3] = {USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3)},
1450 [SVEON_STV22] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22)},
1453 MODULE_DEVICE_TABLE(usb, af9015_usb_table);
1455 #define AF9015_RC_INTERVAL 500
1456 static struct dvb_usb_device_properties af9015_properties[] = {
1458 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1460 .usb_ctrl = DEVICE_SPECIFIC,
1461 .download_firmware = af9015_download_firmware,
1462 .firmware = "dvb-usb-af9015.fw",
1463 .no_reconnect = 1,
1465 .size_of_priv = sizeof(struct af9015_state),
1467 .num_adapters = 2,
1468 .adapter = {
1470 .num_frontends = 1,
1471 .fe = {{
1472 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1473 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1475 .pid_filter_count = 32,
1476 .pid_filter = af9015_pid_filter,
1477 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1479 .frontend_attach =
1480 af9015_af9013_frontend_attach,
1481 .tuner_attach = af9015_tuner_attach,
1482 .stream = {
1483 .type = USB_BULK,
1484 .count = 6,
1485 .endpoint = 0x84,
1490 .num_frontends = 1,
1491 .fe = {{
1492 .frontend_attach =
1493 af9015_af9013_frontend_attach,
1494 .tuner_attach = af9015_tuner_attach,
1495 .stream = {
1496 .type = USB_BULK,
1497 .count = 6,
1498 .endpoint = 0x85,
1499 .u = {
1500 .bulk = {
1501 .buffersize =
1502 TS_USB20_FRAME_SIZE,
1510 .identify_state = af9015_identify_state,
1512 .rc.core = {
1513 .protocol = RC_TYPE_NEC,
1514 .module_name = "af9015",
1515 .rc_query = af9015_rc_query,
1516 .rc_interval = AF9015_RC_INTERVAL,
1517 .allowed_protos = RC_TYPE_NEC,
1520 .i2c_algo = &af9015_i2c_algo,
1522 .num_device_descs = 12, /* check max from dvb-usb.h */
1523 .devices = {
1525 .name = "Afatech AF9015 DVB-T USB2.0 stick",
1526 .cold_ids = {
1527 &af9015_usb_table[AFATECH_9015],
1528 &af9015_usb_table[AFATECH_9016],
1529 NULL
1531 .warm_ids = {NULL},
1534 .name = "Leadtek WinFast DTV Dongle Gold",
1535 .cold_ids = {
1536 &af9015_usb_table[WINFAST_DTV_GOLD],
1537 NULL
1539 .warm_ids = {NULL},
1542 .name = "Pinnacle PCTV 71e",
1543 .cold_ids = {
1544 &af9015_usb_table[PINNACLE_PCTV_71E],
1545 NULL
1547 .warm_ids = {NULL},
1550 .name = "KWorld PlusTV Dual DVB-T Stick " \
1551 "(DVB-T 399U)",
1552 .cold_ids = {
1553 &af9015_usb_table[KWORLD_PLUSTV_399U],
1554 &af9015_usb_table[KWORLD_399U_2],
1555 NULL
1557 .warm_ids = {NULL},
1560 .name = "DigitalNow TinyTwin DVB-T Receiver",
1561 .cold_ids = {
1562 &af9015_usb_table[TINYTWIN],
1563 &af9015_usb_table[TINYTWIN_2],
1564 &af9015_usb_table[TINYTWIN_3],
1565 NULL
1567 .warm_ids = {NULL},
1570 .name = "TwinHan AzureWave AD-TU700(704J)",
1571 .cold_ids = {
1572 &af9015_usb_table[AZUREWAVE_TU700],
1573 NULL
1575 .warm_ids = {NULL},
1578 .name = "TerraTec Cinergy T USB XE",
1579 .cold_ids = {
1580 &af9015_usb_table[TERRATEC_AF9015],
1581 NULL
1583 .warm_ids = {NULL},
1586 .name = "KWorld PlusTV Dual DVB-T PCI " \
1587 "(DVB-T PC160-2T)",
1588 .cold_ids = {
1589 &af9015_usb_table[KWORLD_PLUSTV_PC160],
1590 NULL
1592 .warm_ids = {NULL},
1595 .name = "AVerMedia AVerTV DVB-T Volar X",
1596 .cold_ids = {
1597 &af9015_usb_table[AVERTV_VOLAR_X],
1598 NULL
1600 .warm_ids = {NULL},
1603 .name = "TerraTec Cinergy T Stick RC",
1604 .cold_ids = {
1605 &af9015_usb_table[CINERGY_T_STICK_RC],
1606 NULL
1608 .warm_ids = {NULL},
1611 .name = "TerraTec Cinergy T Stick Dual RC",
1612 .cold_ids = {
1613 &af9015_usb_table[CINERGY_T_DUAL_RC],
1614 NULL
1616 .warm_ids = {NULL},
1619 .name = "AverMedia AVerTV Red HD+ (A850T)",
1620 .cold_ids = {
1621 &af9015_usb_table[AVERTV_A850T],
1622 NULL
1624 .warm_ids = {NULL},
1627 }, {
1628 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1630 .usb_ctrl = DEVICE_SPECIFIC,
1631 .download_firmware = af9015_download_firmware,
1632 .firmware = "dvb-usb-af9015.fw",
1633 .no_reconnect = 1,
1635 .size_of_priv = sizeof(struct af9015_state),
1637 .num_adapters = 2,
1638 .adapter = {
1640 .num_frontends = 1,
1641 .fe = {{
1642 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1643 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1645 .pid_filter_count = 32,
1646 .pid_filter = af9015_pid_filter,
1647 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1649 .frontend_attach =
1650 af9015_af9013_frontend_attach,
1651 .tuner_attach = af9015_tuner_attach,
1652 .stream = {
1653 .type = USB_BULK,
1654 .count = 6,
1655 .endpoint = 0x84,
1660 .num_frontends = 1,
1661 .fe = {{
1662 .frontend_attach =
1663 af9015_af9013_frontend_attach,
1664 .tuner_attach = af9015_tuner_attach,
1665 .stream = {
1666 .type = USB_BULK,
1667 .count = 6,
1668 .endpoint = 0x85,
1669 .u = {
1670 .bulk = {
1671 .buffersize =
1672 TS_USB20_FRAME_SIZE,
1680 .identify_state = af9015_identify_state,
1682 .rc.core = {
1683 .protocol = RC_TYPE_NEC,
1684 .module_name = "af9015",
1685 .rc_query = af9015_rc_query,
1686 .rc_interval = AF9015_RC_INTERVAL,
1687 .allowed_protos = RC_TYPE_NEC,
1690 .i2c_algo = &af9015_i2c_algo,
1692 .num_device_descs = 10, /* check max from dvb-usb.h */
1693 .devices = {
1695 .name = "Xtensions XD-380",
1696 .cold_ids = {
1697 &af9015_usb_table[XTENSIONS_380U],
1698 NULL
1700 .warm_ids = {NULL},
1703 .name = "MSI DIGIVOX Duo",
1704 .cold_ids = {
1705 &af9015_usb_table[MSI_DIGIVOX_DUO],
1706 NULL
1708 .warm_ids = {NULL},
1711 .name = "Fujitsu-Siemens Slim Mobile USB DVB-T",
1712 .cold_ids = {
1713 &af9015_usb_table[AVERTV_VOLAR_X_REV2],
1714 NULL
1716 .warm_ids = {NULL},
1719 .name = "Telestar Starstick 2",
1720 .cold_ids = {
1721 &af9015_usb_table[TELESTAR_STARSTICK_2],
1722 NULL
1724 .warm_ids = {NULL},
1727 .name = "AVerMedia A309",
1728 .cold_ids = {
1729 &af9015_usb_table[AVERMEDIA_A309_USB],
1730 NULL
1732 .warm_ids = {NULL},
1735 .name = "MSI Digi VOX mini III",
1736 .cold_ids = {
1737 &af9015_usb_table[MSI_DIGIVOX_MINI_III],
1738 NULL
1740 .warm_ids = {NULL},
1743 .name = "KWorld USB DVB-T TV Stick II " \
1744 "(VS-DVB-T 395U)",
1745 .cold_ids = {
1746 &af9015_usb_table[KWORLD_E396],
1747 &af9015_usb_table[KWORLD_E39B],
1748 &af9015_usb_table[KWORLD_E395],
1749 &af9015_usb_table[KWORLD_E39A],
1750 NULL
1752 .warm_ids = {NULL},
1755 .name = "TrekStor DVB-T USB Stick",
1756 .cold_ids = {
1757 &af9015_usb_table[TREKSTOR_DVBT],
1758 NULL
1760 .warm_ids = {NULL},
1763 .name = "AverMedia AVerTV Volar Black HD " \
1764 "(A850)",
1765 .cold_ids = {
1766 &af9015_usb_table[AVERTV_A850],
1767 NULL
1769 .warm_ids = {NULL},
1772 .name = "Sveon STV22 Dual USB DVB-T Tuner HDTV",
1773 .cold_ids = {
1774 &af9015_usb_table[SVEON_STV22],
1775 NULL
1777 .warm_ids = {NULL},
1780 }, {
1781 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1783 .usb_ctrl = DEVICE_SPECIFIC,
1784 .download_firmware = af9015_download_firmware,
1785 .firmware = "dvb-usb-af9015.fw",
1786 .no_reconnect = 1,
1788 .size_of_priv = sizeof(struct af9015_state),
1790 .num_adapters = 2,
1791 .adapter = {
1793 .num_frontends = 1,
1794 .fe = {{
1795 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1796 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1798 .pid_filter_count = 32,
1799 .pid_filter = af9015_pid_filter,
1800 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1802 .frontend_attach =
1803 af9015_af9013_frontend_attach,
1804 .tuner_attach = af9015_tuner_attach,
1805 .stream = {
1806 .type = USB_BULK,
1807 .count = 6,
1808 .endpoint = 0x84,
1813 .num_frontends = 1,
1814 .fe = {{
1815 .frontend_attach =
1816 af9015_af9013_frontend_attach,
1817 .tuner_attach = af9015_tuner_attach,
1818 .stream = {
1819 .type = USB_BULK,
1820 .count = 6,
1821 .endpoint = 0x85,
1822 .u = {
1823 .bulk = {
1824 .buffersize =
1825 TS_USB20_FRAME_SIZE,
1833 .identify_state = af9015_identify_state,
1835 .rc.core = {
1836 .protocol = RC_TYPE_NEC,
1837 .module_name = "af9015",
1838 .rc_query = af9015_rc_query,
1839 .rc_interval = AF9015_RC_INTERVAL,
1840 .allowed_protos = RC_TYPE_NEC,
1843 .i2c_algo = &af9015_i2c_algo,
1845 .num_device_descs = 9, /* check max from dvb-usb.h */
1846 .devices = {
1848 .name = "AverMedia AVerTV Volar GPS 805 (A805)",
1849 .cold_ids = {
1850 &af9015_usb_table[AVERTV_A805],
1851 NULL
1853 .warm_ids = {NULL},
1856 .name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1857 "V3.0",
1858 .cold_ids = {
1859 &af9015_usb_table[CONCEPTRONIC_CTVDIGRCU],
1860 NULL
1862 .warm_ids = {NULL},
1865 .name = "KWorld Digial MC-810",
1866 .cold_ids = {
1867 &af9015_usb_table[KWORLD_MC810],
1868 NULL
1870 .warm_ids = {NULL},
1873 .name = "Genius TVGo DVB-T03",
1874 .cold_ids = {
1875 &af9015_usb_table[GENIUS_TVGO_DVB_T03],
1876 NULL
1878 .warm_ids = {NULL},
1881 .name = "KWorld PlusTV DVB-T PCI Pro Card " \
1882 "(DVB-T PC160-T)",
1883 .cold_ids = {
1884 &af9015_usb_table[KWORLD_PC160_T],
1885 NULL
1887 .warm_ids = {NULL},
1890 .name = "Sveon STV20 Tuner USB DVB-T HDTV",
1891 .cold_ids = {
1892 &af9015_usb_table[SVEON_STV20],
1893 NULL
1895 .warm_ids = {NULL},
1898 .name = "Leadtek WinFast DTV2000DS",
1899 .cold_ids = {
1900 &af9015_usb_table[WINFAST_DTV2000DS],
1901 NULL
1903 .warm_ids = {NULL},
1906 .name = "KWorld USB DVB-T Stick Mobile " \
1907 "(UB383-T)",
1908 .cold_ids = {
1909 &af9015_usb_table[KWORLD_UB383_T],
1910 NULL
1912 .warm_ids = {NULL},
1915 .name = "AverMedia AVerTV Volar M (A815Mac)",
1916 .cold_ids = {
1917 &af9015_usb_table[AVERMEDIA_A815M],
1918 NULL
1920 .warm_ids = {NULL},
1926 static int af9015_usb_probe(struct usb_interface *intf,
1927 const struct usb_device_id *id)
1929 int ret = 0;
1930 struct dvb_usb_device *d = NULL;
1931 struct usb_device *udev = interface_to_usbdev(intf);
1932 u8 i;
1934 deb_info("%s: interface:%d\n", __func__,
1935 intf->cur_altsetting->desc.bInterfaceNumber);
1937 /* interface 0 is used by DVB-T receiver and
1938 interface 1 is for remote controller (HID) */
1939 if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
1940 ret = af9015_read_config(udev);
1941 if (ret)
1942 return ret;
1944 for (i = 0; i < af9015_properties_count; i++) {
1945 ret = dvb_usb_device_init(intf, &af9015_properties[i],
1946 THIS_MODULE, &d, adapter_nr);
1947 if (!ret)
1948 break;
1949 if (ret != -ENODEV)
1950 return ret;
1952 if (ret)
1953 return ret;
1955 if (d)
1956 ret = af9015_init(d);
1959 return ret;
1962 /* usb specific object needed to register this driver with the usb subsystem */
1963 static struct usb_driver af9015_usb_driver = {
1964 .name = "dvb_usb_af9015",
1965 .probe = af9015_usb_probe,
1966 .disconnect = dvb_usb_device_exit,
1967 .id_table = af9015_usb_table,
1970 module_usb_driver(af9015_usb_driver);
1972 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1973 MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1974 MODULE_LICENSE("GPL");