blob: 6457d042b1a0861060d8fc9cc7d98f16b273e7b8 [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
Jiri Slaby6c614042010-01-22 12:10:52 -030024#include <linux/hash.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090025#include <linux/slab.h>
Jiri Slaby6c614042010-01-22 12:10:52 -030026
Antti Palosaari80619de2008-09-15 17:18:09 -030027#include "af9015.h"
28#include "af9013.h"
29#include "mt2060.h"
30#include "qt1010.h"
31#include "tda18271.h"
32#include "mxl5005s.h"
Jochen Friedrichd5633992009-02-02 14:59:50 -030033#include "mc44s803.h"
Antti Palosaariee3d4402010-08-13 03:51:26 -030034#include "tda18218.h"
Antti Palosaariab07fdd2010-09-09 14:59:10 -030035#include "mxl5007t.h"
Antti Palosaari80619de2008-09-15 17:18:09 -030036
Antti Palosaari349d0422008-11-05 16:31:24 -030037static int dvb_usb_af9015_debug;
Antti Palosaari80619de2008-09-15 17:18:09 -030038module_param_named(debug, dvb_usb_af9015_debug, int, 0644);
39MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
Antti Palosaari349d0422008-11-05 16:31:24 -030040static int dvb_usb_af9015_remote;
Antti Palosaari80619de2008-09-15 17:18:09 -030041module_param_named(remote, dvb_usb_af9015_remote, int, 0644);
42MODULE_PARM_DESC(remote, "select remote");
Antti Palosaari80619de2008-09-15 17:18:09 -030043DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
44
45static DEFINE_MUTEX(af9015_usb_mutex);
46
47static struct af9015_config af9015_config;
Antti Palosaari85d7d7c2009-04-09 09:16:12 -030048static struct dvb_usb_device_properties af9015_properties[3];
Antti Palosaari349d0422008-11-05 16:31:24 -030049static int af9015_properties_count = ARRAY_SIZE(af9015_properties);
Antti Palosaari80619de2008-09-15 17:18:09 -030050
51static struct af9013_config af9015_af9013_config[] = {
52 {
53 .demod_address = AF9015_I2C_DEMOD,
54 .output_mode = AF9013_OUTPUT_MODE_USB,
55 .api_version = { 0, 1, 9, 0 },
56 .gpio[0] = AF9013_GPIO_HI,
Antti Palosaari80619de2008-09-15 17:18:09 -030057 .gpio[3] = AF9013_GPIO_TUNER_ON,
58
59 }, {
60 .output_mode = AF9013_OUTPUT_MODE_SERIAL,
61 .api_version = { 0, 1, 9, 0 },
62 .gpio[0] = AF9013_GPIO_TUNER_ON,
63 .gpio[1] = AF9013_GPIO_LO,
64 }
65};
66
67static int af9015_rw_udev(struct usb_device *udev, struct req_t *req)
68{
Antti Palosaari06565d72009-09-12 20:46:30 -030069#define BUF_LEN 63
70#define REQ_HDR_LEN 8 /* send header size */
71#define ACK_HDR_LEN 2 /* rece header size */
Antti Palosaari80619de2008-09-15 17:18:09 -030072 int act_len, ret;
Antti Palosaari06565d72009-09-12 20:46:30 -030073 u8 buf[BUF_LEN];
Antti Palosaari80619de2008-09-15 17:18:09 -030074 u8 write = 1;
Antti Palosaari06565d72009-09-12 20:46:30 -030075 u8 msg_len = REQ_HDR_LEN;
Antti Palosaari80619de2008-09-15 17:18:09 -030076 static u8 seq; /* packet sequence number */
77
78 if (mutex_lock_interruptible(&af9015_usb_mutex) < 0)
79 return -EAGAIN;
80
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;
89
90 switch (req->cmd) {
91 case GET_CONFIG:
Antti Palosaari80619de2008-09-15 17:18:09 -030092 case READ_MEMORY:
93 case RECONNECT_USB:
94 case GET_IR_CODE:
95 write = 0;
96 break;
97 case READ_I2C:
98 write = 0;
99 buf[2] |= 0x01; /* set I2C direction */
100 case WRITE_I2C:
101 buf[0] = READ_WRITE_I2C;
102 break;
103 case WRITE_MEMORY:
104 if (((req->addr & 0xff00) == 0xff00) ||
Antti Palosaarif4e96de2009-09-12 21:25:59 -0300105 ((req->addr & 0xff00) == 0xae00))
Antti Palosaari80619de2008-09-15 17:18:09 -0300106 buf[0] = WRITE_VIRTUAL_MEMORY;
107 case WRITE_VIRTUAL_MEMORY:
108 case COPY_FIRMWARE:
109 case DOWNLOAD_FIRMWARE:
Nils Kassubeba1bc642009-07-28 11:54:52 -0300110 case BOOT:
Antti Palosaari80619de2008-09-15 17:18:09 -0300111 break;
112 default:
113 err("unknown command:%d", req->cmd);
114 ret = -1;
115 goto error_unlock;
116 }
117
Antti Palosaari06565d72009-09-12 20:46:30 -0300118 /* buffer overflow check */
119 if ((write && (req->data_len > BUF_LEN - REQ_HDR_LEN)) ||
120 (!write && (req->data_len > BUF_LEN - ACK_HDR_LEN))) {
121 err("too much data; cmd:%d len:%d", req->cmd, req->data_len);
122 ret = -EINVAL;
123 goto error_unlock;
124 }
125
Antti Palosaari80619de2008-09-15 17:18:09 -0300126 /* write requested */
127 if (write) {
Antti Palosaari06565d72009-09-12 20:46:30 -0300128 memcpy(&buf[REQ_HDR_LEN], req->data, req->data_len);
Antti Palosaari80619de2008-09-15 17:18:09 -0300129 msg_len += req->data_len;
130 }
Antti Palosaari06565d72009-09-12 20:46:30 -0300131
Antti Palosaari80619de2008-09-15 17:18:09 -0300132 deb_xfer(">>> ");
133 debug_dump(buf, msg_len, deb_xfer);
134
135 /* send req */
136 ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x02), buf, msg_len,
Antti Palosaari06565d72009-09-12 20:46:30 -0300137 &act_len, AF9015_USB_TIMEOUT);
Antti Palosaari80619de2008-09-15 17:18:09 -0300138 if (ret)
139 err("bulk message failed:%d (%d/%d)", ret, msg_len, act_len);
140 else
141 if (act_len != msg_len)
142 ret = -1; /* all data is not send */
143 if (ret)
144 goto error_unlock;
145
146 /* no ack for those packets */
147 if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB)
148 goto exit_unlock;
149
Antti Palosaari06565d72009-09-12 20:46:30 -0300150 /* write receives seq + status = 2 bytes
151 read receives seq + status + data = 2 + N bytes */
152 msg_len = ACK_HDR_LEN;
153 if (!write)
154 msg_len += req->data_len;
155
Antti Palosaari80619de2008-09-15 17:18:09 -0300156 ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, 0x81), buf, msg_len,
Antti Palosaari06565d72009-09-12 20:46:30 -0300157 &act_len, AF9015_USB_TIMEOUT);
Antti Palosaari80619de2008-09-15 17:18:09 -0300158 if (ret) {
159 err("recv bulk message failed:%d", ret);
160 ret = -1;
161 goto error_unlock;
162 }
163
164 deb_xfer("<<< ");
165 debug_dump(buf, act_len, deb_xfer);
166
167 /* remote controller query status is 1 if remote code is not received */
168 if (req->cmd == GET_IR_CODE && buf[1] == 1) {
169 buf[1] = 0; /* clear command "error" status */
170 memset(&buf[2], 0, req->data_len);
171 buf[3] = 1; /* no remote code received mark */
172 }
173
174 /* check status */
175 if (buf[1]) {
176 err("command failed:%d", buf[1]);
177 ret = -1;
178 goto error_unlock;
179 }
180
181 /* read request, copy returned data to return buf */
182 if (!write)
Antti Palosaari06565d72009-09-12 20:46:30 -0300183 memcpy(req->data, &buf[ACK_HDR_LEN], req->data_len);
Antti Palosaari80619de2008-09-15 17:18:09 -0300184
185error_unlock:
186exit_unlock:
187 mutex_unlock(&af9015_usb_mutex);
188
189 return ret;
190}
191
192static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req)
193{
194 return af9015_rw_udev(d->udev, req);
195}
196
197static int af9015_write_regs(struct dvb_usb_device *d, u16 addr, u8 *val,
198 u8 len)
199{
200 struct req_t req = {WRITE_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
201 val};
202 return af9015_ctrl_msg(d, &req);
203}
204
205static int af9015_write_reg(struct dvb_usb_device *d, u16 addr, u8 val)
206{
207 return af9015_write_regs(d, addr, &val, 1);
208}
209
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300210static int af9015_read_regs(struct dvb_usb_device *d, u16 addr, u8 *val, u8 len)
211{
212 struct req_t req = {READ_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
213 val};
214 return af9015_ctrl_msg(d, &req);
215}
216
Antti Palosaari80619de2008-09-15 17:18:09 -0300217static int af9015_read_reg(struct dvb_usb_device *d, u16 addr, u8 *val)
218{
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300219 return af9015_read_regs(d, addr, val, 1);
Antti Palosaari80619de2008-09-15 17:18:09 -0300220}
221
222static int af9015_write_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
223 u8 val)
224{
225 struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val};
226
227 if (addr == af9015_af9013_config[0].demod_address ||
228 addr == af9015_af9013_config[1].demod_address)
229 req.addr_len = 3;
230
231 return af9015_ctrl_msg(d, &req);
232}
233
234static int af9015_read_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
235 u8 *val)
236{
237 struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val};
238
239 if (addr == af9015_af9013_config[0].demod_address ||
240 addr == af9015_af9013_config[1].demod_address)
241 req.addr_len = 3;
242
243 return af9015_ctrl_msg(d, &req);
244}
245
246static int af9015_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
247 int num)
248{
249 struct dvb_usb_device *d = i2c_get_adapdata(adap);
250 int ret = 0, i = 0;
251 u16 addr;
Antti Palosaari675375d2010-10-07 21:46:41 -0300252 u8 uninitialized_var(mbox), addr_len;
Antti Palosaari80619de2008-09-15 17:18:09 -0300253 struct req_t req;
254
255/* TODO: implement bus lock
256
257The bus lock is needed because there is two tuners both using same I2C-address.
258Due to that the only way to select correct tuner is use demodulator I2C-gate.
259
260................................................
261. AF9015 includes integrated AF9013 demodulator.
262. ____________ ____________ . ____________
263.| uC | | demod | . | tuner |
264.|------------| |------------| . |------------|
265.| AF9015 | | AF9013/5 | . | MXL5003 |
266.| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
267.| | | | addr 0x38 | . | addr 0xc6 |
268.|____________| | |____________| . |____________|
269.................|..............................
270 | ____________ ____________
271 | | demod | | tuner |
272 | |------------| |------------|
273 | | AF9013 | | MXL5003 |
274 +----I2C-------|-----/ -----|-------I2C-------| |
275 | addr 0x3a | | addr 0xc6 |
276 |____________| |____________|
277*/
278 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
279 return -EAGAIN;
280
281 while (i < num) {
282 if (msg[i].addr == af9015_af9013_config[0].demod_address ||
283 msg[i].addr == af9015_af9013_config[1].demod_address) {
284 addr = msg[i].buf[0] << 8;
285 addr += msg[i].buf[1];
286 mbox = msg[i].buf[2];
287 addr_len = 3;
288 } else {
289 addr = msg[i].buf[0];
290 addr_len = 1;
Antti Palosaari675375d2010-10-07 21:46:41 -0300291 /* mbox is don't care in that case */
Antti Palosaari80619de2008-09-15 17:18:09 -0300292 }
293
294 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
295 if (msg[i].addr ==
296 af9015_af9013_config[0].demod_address)
297 req.cmd = READ_MEMORY;
298 else
299 req.cmd = READ_I2C;
300 req.i2c_addr = msg[i].addr;
301 req.addr = addr;
302 req.mbox = mbox;
303 req.addr_len = addr_len;
304 req.data_len = msg[i+1].len;
305 req.data = &msg[i+1].buf[0];
306 ret = af9015_ctrl_msg(d, &req);
307 i += 2;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300308 } else if (msg[i].flags & I2C_M_RD) {
309 ret = -EINVAL;
310 if (msg[i].addr ==
311 af9015_af9013_config[0].demod_address)
312 goto error;
313 else
314 req.cmd = READ_I2C;
315 req.i2c_addr = msg[i].addr;
316 req.addr = addr;
317 req.mbox = mbox;
318 req.addr_len = addr_len;
319 req.data_len = msg[i].len;
320 req.data = &msg[i].buf[0];
321 ret = af9015_ctrl_msg(d, &req);
322 i += 1;
Antti Palosaari80619de2008-09-15 17:18:09 -0300323 } else {
324 if (msg[i].addr ==
325 af9015_af9013_config[0].demod_address)
326 req.cmd = WRITE_MEMORY;
327 else
328 req.cmd = WRITE_I2C;
329 req.i2c_addr = msg[i].addr;
330 req.addr = addr;
331 req.mbox = mbox;
332 req.addr_len = addr_len;
333 req.data_len = msg[i].len-addr_len;
334 req.data = &msg[i].buf[addr_len];
335 ret = af9015_ctrl_msg(d, &req);
336 i += 1;
337 }
338 if (ret)
339 goto error;
340
341 }
342 ret = i;
343
344error:
345 mutex_unlock(&d->i2c_mutex);
346
347 return ret;
348}
349
350static u32 af9015_i2c_func(struct i2c_adapter *adapter)
351{
352 return I2C_FUNC_I2C;
353}
354
355static struct i2c_algorithm af9015_i2c_algo = {
356 .master_xfer = af9015_i2c_xfer,
357 .functionality = af9015_i2c_func,
358};
359
360static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op)
361{
362 int ret;
363 u8 val, mask = 0x01;
364
365 ret = af9015_read_reg(d, addr, &val);
366 if (ret)
367 return ret;
368
369 mask <<= bit;
370 if (op) {
371 /* set bit */
372 val |= mask;
373 } else {
374 /* clear bit */
375 mask ^= 0xff;
376 val &= mask;
377 }
378
379 return af9015_write_reg(d, addr, val);
380}
381
382static int af9015_set_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
383{
384 return af9015_do_reg_bit(d, addr, bit, 1);
385}
386
387static int af9015_clear_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
388{
389 return af9015_do_reg_bit(d, addr, bit, 0);
390}
391
392static int af9015_init_endpoint(struct dvb_usb_device *d)
393{
394 int ret;
395 u16 frame_size;
396 u8 packet_size;
397 deb_info("%s: USB speed:%d\n", __func__, d->udev->speed);
398
Antti Palosaari9c863272009-09-12 13:35:29 -0300399 /* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0.
400 We use smaller - about 1/4 from the original, 5 and 87. */
Antti Palosaari80619de2008-09-15 17:18:09 -0300401#define TS_PACKET_SIZE 188
402
Antti Palosaari9c863272009-09-12 13:35:29 -0300403#define TS_USB20_PACKET_COUNT 87
Antti Palosaari80619de2008-09-15 17:18:09 -0300404#define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT)
405
Antti Palosaari9c863272009-09-12 13:35:29 -0300406#define TS_USB11_PACKET_COUNT 5
Antti Palosaari80619de2008-09-15 17:18:09 -0300407#define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT)
408
409#define TS_USB20_MAX_PACKET_SIZE 512
410#define TS_USB11_MAX_PACKET_SIZE 64
411
412 if (d->udev->speed == USB_SPEED_FULL) {
413 frame_size = TS_USB11_FRAME_SIZE/4;
414 packet_size = TS_USB11_MAX_PACKET_SIZE/4;
415 } else {
416 frame_size = TS_USB20_FRAME_SIZE/4;
417 packet_size = TS_USB20_MAX_PACKET_SIZE/4;
418 }
419
420 ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
421 if (ret)
422 goto error;
423 ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
424 if (ret)
425 goto error;
426 ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
427 if (ret)
428 goto error;
429 ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
430 if (ret)
431 goto error;
432 ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
433 if (ret)
434 goto error;
435 if (af9015_config.dual_mode) {
436 ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
437 if (ret)
438 goto error;
439 }
440 ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
441 if (ret)
442 goto error;
443 if (af9015_config.dual_mode) {
444 ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
445 if (ret)
446 goto error;
447 }
448 /* EP4 xfer length */
449 ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
450 if (ret)
451 goto error;
452 ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
453 if (ret)
454 goto error;
455 /* EP5 xfer length */
456 ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
457 if (ret)
458 goto error;
459 ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
460 if (ret)
461 goto error;
462 ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
463 if (ret)
464 goto error;
465 ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
466 if (ret)
467 goto error;
468 ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
469 if (ret)
470 goto error;
471 if (af9015_config.dual_mode) {
472 ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
473 if (ret)
474 goto error;
475 }
476
477 /* enable / disable mp2if2 */
478 if (af9015_config.dual_mode)
479 ret = af9015_set_reg_bit(d, 0xd50b, 0);
480 else
481 ret = af9015_clear_reg_bit(d, 0xd50b, 0);
Ian Armstrongc1e13972011-03-18 19:23:05 -0300482 if (ret)
483 goto error;
484 ret = af9015_write_reg(d, 0x98e9, 0xff);
Antti Palosaari80619de2008-09-15 17:18:09 -0300485error:
486 if (ret)
487 err("endpoint init failed:%d", ret);
488 return ret;
489}
490
491static int af9015_copy_firmware(struct dvb_usb_device *d)
492{
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__);
499
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;
504
505 /* wait 2nd demodulator ready */
506 msleep(100);
507
Antti Palosaaried19a5d2010-09-12 21:02:55 -0300508 ret = af9015_read_reg_i2c(d,
509 af9015_af9013_config[1].demod_address, 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300510 if (ret)
511 goto error;
512 else
513 deb_info("%s: firmware status:%02x\n", __func__, val);
514
515 if (val == 0x0c) /* fw is running, no need for download */
516 goto exit;
517
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;
522
523 msleep(50);
524
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__);
530
531 /* set I2C master clock back to normal */
532 ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
533 if (ret)
534 goto error;
535
536 /* request boot firmware */
537 ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].demod_address,
538 0xe205, 1);
539 deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
540 if (ret)
541 goto error;
542
543 for (i = 0; i < 15; i++) {
544 msleep(100);
545
546 /* check firmware status */
547 ret = af9015_read_reg_i2c(d,
548 af9015_af9013_config[1].demod_address, 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;
553
554 if (val == 0x0c || val == 0x04) /* success or fail */
555 break;
556 }
557
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;
564 }
565
566error:
567exit:
568 return ret;
569}
570
Jiri Slaby6c614042010-01-22 12:10:52 -0300571/* hash (and dump) eeprom */
572static int af9015_eeprom_hash(struct usb_device *udev)
Antti Palosaari80619de2008-09-15 17:18:09 -0300573{
Jiri Slaby6c614042010-01-22 12:10:52 -0300574 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};
Antti Palosaari80619de2008-09-15 17:18:09 -0300579
Jiri Slaby6c614042010-01-22 12:10:52 -0300580 eeprom = kmalloc(eeprom_size, GFP_KERNEL);
581 if (eeprom == NULL)
582 return -ENOMEM;
583
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;
Antti Palosaari80619de2008-09-15 17:18:09 -0300590 }
Jiri Slaby6c614042010-01-22 12:10:52 -0300591
592 if (dvb_usb_af9015_debug & 0x01)
593 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, eeprom,
594 eeprom_size);
595
596 BUG_ON(eeprom_size % 4);
597
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]);
602 }
603
604 deb_info("%s: eeprom sum=%.8x\n", __func__, af9015_config.eeprom_sum);
605
606 ret = 0;
607free:
608 kfree(eeprom);
609 return ret;
Antti Palosaari80619de2008-09-15 17:18:09 -0300610}
611
Antti Palosaari80619de2008-09-15 17:18:09 -0300612static int af9015_init(struct dvb_usb_device *d)
613{
614 int ret;
615 deb_info("%s:\n", __func__);
616
617 ret = af9015_init_endpoint(d);
618 if (ret)
619 goto error;
620
Antti Palosaari80619de2008-09-15 17:18:09 -0300621error:
622 return ret;
623}
624
625static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
626{
627 int ret;
628 deb_info("%s: onoff:%d\n", __func__, onoff);
629
630 if (onoff)
631 ret = af9015_set_reg_bit(adap->dev, 0xd503, 0);
632 else
633 ret = af9015_clear_reg_bit(adap->dev, 0xd503, 0);
634
635 return ret;
636}
637
638static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
639 int onoff)
640{
641 int ret;
642 u8 idx;
643
644 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
645 __func__, index, pid, onoff);
646
647 ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
648 if (ret)
649 goto error;
650
651 ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
652 if (ret)
653 goto error;
654
655 idx = ((index & 0x1f) | (1 << 5));
656 ret = af9015_write_reg(adap->dev, 0xd504, idx);
657
658error:
659 return ret;
660}
661
662static int af9015_download_firmware(struct usb_device *udev,
663 const struct firmware *fw)
664{
665 int i, len, packets, remainder, ret;
666 struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL};
667 u16 addr = 0x5100; /* firmware start address */
668 u16 checksum = 0;
669
670 deb_info("%s:\n", __func__);
671
672 /* calc checksum */
673 for (i = 0; i < fw->size; i++)
674 checksum += fw->data[i];
675
676 af9015_config.firmware_size = fw->size;
677 af9015_config.firmware_checksum = checksum;
678
679 #define FW_PACKET_MAX_DATA 55
680
681 packets = fw->size / FW_PACKET_MAX_DATA;
682 remainder = fw->size % FW_PACKET_MAX_DATA;
683 len = FW_PACKET_MAX_DATA;
684 for (i = 0; i <= packets; i++) {
685 if (i == packets) /* set size of the last packet */
686 len = remainder;
687
688 req.data_len = len;
Antti Palosaari541dfa82008-10-06 13:57:45 -0300689 req.data = (u8 *)(fw->data + i * FW_PACKET_MAX_DATA);
Antti Palosaari80619de2008-09-15 17:18:09 -0300690 req.addr = addr;
691 addr += FW_PACKET_MAX_DATA;
692
693 ret = af9015_rw_udev(udev, &req);
694 if (ret) {
695 err("firmware download failed at packet %d with " \
696 "code %d", i, ret);
697 goto error;
698 }
699 }
Antti Palosaari80619de2008-09-15 17:18:09 -0300700
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;
707 }
708
Antti Palosaari80619de2008-09-15 17:18:09 -0300709error:
710 return ret;
711}
712
Antti Palosaari1cd72782010-10-12 17:22:32 -0300713struct af9015_rc_setup {
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300714 unsigned int id;
Antti Palosaari1cd72782010-10-12 17:22:32 -0300715 char *rc_codes;
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300716};
717
Antti Palosaari1cd72782010-10-12 17:22:32 -0300718static char *af9015_rc_setup_match(unsigned int id,
719 const struct af9015_rc_setup *table)
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300720{
Antti Palosaari1cd72782010-10-12 17:22:32 -0300721 for (; table->rc_codes; table++)
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300722 if (table->id == id)
Antti Palosaari1cd72782010-10-12 17:22:32 -0300723 return table->rc_codes;
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300724 return NULL;
725}
726
Antti Palosaari1cd72782010-10-12 17:22:32 -0300727static 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 },
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300733 { }
734};
735
Antti Palosaari1cd72782010-10-12 17:22:32 -0300736static 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 */
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300740 { }
741};
742
Antti Palosaari1cd72782010-10-12 17:22:32 -0300743static const struct af9015_rc_setup af9015_rc_setup_usbids[] = {
744 { (USB_VID_TERRATEC << 16) + USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
745 RC_MAP_TERRATEC_SLIM },
746 { (USB_VID_VISIONPLUS << 16) + USB_PID_AZUREWAVE_AD_TU700,
747 RC_MAP_AZUREWAVE_AD_TU700 },
748 { (USB_VID_VISIONPLUS << 16) + USB_PID_TINYTWIN,
749 RC_MAP_AZUREWAVE_AD_TU700 },
750 { (USB_VID_MSI_2 << 16) + USB_PID_MSI_DIGI_VOX_MINI_III,
751 RC_MAP_MSI_DIGIVOX_III },
752 { (USB_VID_LEADTEK << 16) + USB_PID_WINFAST_DTV_DONGLE_GOLD,
753 RC_MAP_LEADTEK_Y04G0051 },
754 { (USB_VID_AVERMEDIA << 16) + USB_PID_AVERMEDIA_VOLAR_X,
755 RC_MAP_AVERMEDIA_M135A },
756 { (USB_VID_AFATECH << 16) + USB_PID_TREKSTOR_DVBT,
757 RC_MAP_TREKSTOR },
Antti Palosaaribd864ce2010-10-22 20:37:11 -0300758 { (USB_VID_KWORLD_2 << 16) + USB_PID_TINYTWIN_2,
759 RC_MAP_DIGITALNOW_TINYTWIN },
Antti Palosaarif8c61272010-10-23 07:35:31 -0300760 { (USB_VID_GTEK << 16) + USB_PID_TINYTWIN_3,
761 RC_MAP_DIGITALNOW_TINYTWIN },
Jiri Slabye3a0cc62010-01-22 12:10:55 -0300762 { }
763};
764
Jiri Slaby634d2d72010-01-22 12:10:53 -0300765static void af9015_set_remote_config(struct usb_device *udev,
766 struct dvb_usb_device_properties *props)
767{
Antti Palosaari1cd72782010-10-12 17:22:32 -0300768 u16 vid = le16_to_cpu(udev->descriptor.idVendor);
769 u16 pid = le16_to_cpu(udev->descriptor.idProduct);
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300770
Antti Palosaari1cd72782010-10-12 17:22:32 -0300771 /* try to load remote based module param */
772 props->rc.core.rc_codes = af9015_rc_setup_match(
773 dvb_usb_af9015_remote, af9015_rc_setup_modparam);
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300774
Antti Palosaari1cd72782010-10-12 17:22:32 -0300775 /* try to load remote based eeprom hash */
776 if (!props->rc.core.rc_codes)
777 props->rc.core.rc_codes = af9015_rc_setup_match(
778 af9015_config.eeprom_sum, af9015_rc_setup_hashes);
Jiri Slabye3a0cc62010-01-22 12:10:55 -0300779
Antti Palosaari1cd72782010-10-12 17:22:32 -0300780 /* try to load remote based USB ID */
781 if (!props->rc.core.rc_codes)
782 props->rc.core.rc_codes = af9015_rc_setup_match(
783 (vid << 16) + pid, af9015_rc_setup_usbids);
784
785 /* try to load remote based USB iManufacturer string */
786 if (!props->rc.core.rc_codes && vid == USB_VID_AFATECH) {
787 /* Check USB manufacturer and product strings and try
788 to determine correct remote in case of chip vendor
789 reference IDs are used.
790 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
791 char manufacturer[10];
792 memset(manufacturer, 0, sizeof(manufacturer));
793 usb_string(udev, udev->descriptor.iManufacturer,
794 manufacturer, sizeof(manufacturer));
795 if (!strcmp("MSI", manufacturer)) {
796 /* iManufacturer 1 MSI
797 iProduct 2 MSI K-VOX */
798 props->rc.core.rc_codes = af9015_rc_setup_match(
799 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
800 af9015_rc_setup_modparam);
801 }
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300802 }
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300803
804 /* finally load "empty" just for leaving IR receiver enabled */
805 if (!props->rc.core.rc_codes)
806 props->rc.core.rc_codes = RC_MAP_EMPTY;
807
Antti Palosaari1cd72782010-10-12 17:22:32 -0300808 return;
Jiri Slaby634d2d72010-01-22 12:10:53 -0300809}
810
Antti Palosaari80619de2008-09-15 17:18:09 -0300811static int af9015_read_config(struct usb_device *udev)
812{
813 int ret;
814 u8 val, i, offset = 0;
815 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
Antti Palosaari80619de2008-09-15 17:18:09 -0300816
817 /* IR remote controller */
818 req.addr = AF9015_EEPROM_IR_MODE;
Antti Palosaarid1a470f2009-01-20 14:56:20 -0300819 /* first message will timeout often due to possible hw bug */
820 for (i = 0; i < 4; i++) {
821 ret = af9015_rw_udev(udev, &req);
822 if (!ret)
823 break;
824 }
Antti Palosaari80619de2008-09-15 17:18:09 -0300825 if (ret)
826 goto error;
Jiri Slaby6c614042010-01-22 12:10:52 -0300827
828 ret = af9015_eeprom_hash(udev);
829 if (ret)
830 goto error;
831
Antti Palosaari80619de2008-09-15 17:18:09 -0300832 deb_info("%s: IR mode:%d\n", __func__, val);
833 for (i = 0; i < af9015_properties_count; i++) {
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300834 if (val == AF9015_IR_MODE_DISABLED)
835 af9015_properties[i].rc.core.rc_codes = NULL;
836 else
Jiri Slaby634d2d72010-01-22 12:10:53 -0300837 af9015_set_remote_config(udev, &af9015_properties[i]);
Antti Palosaari80619de2008-09-15 17:18:09 -0300838 }
839
840 /* TS mode - one or two receivers */
841 req.addr = AF9015_EEPROM_TS_MODE;
842 ret = af9015_rw_udev(udev, &req);
843 if (ret)
844 goto error;
845 af9015_config.dual_mode = val;
846 deb_info("%s: TS mode:%d\n", __func__, af9015_config.dual_mode);
Antti Palosaari80619de2008-09-15 17:18:09 -0300847
Antti Palosaarif0830eb2009-01-13 13:08:29 -0300848 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
849 size can be static because it is enabled only USB2.0 */
Antti Palosaari80619de2008-09-15 17:18:09 -0300850 for (i = 0; i < af9015_properties_count; i++) {
851 /* USB1.1 set smaller buffersize and disable 2nd adapter */
852 if (udev->speed == USB_SPEED_FULL) {
Antti Palosaarif0830eb2009-01-13 13:08:29 -0300853 af9015_properties[i].adapter[0].stream.u.bulk.buffersize
Antti Palosaari9c863272009-09-12 13:35:29 -0300854 = TS_USB11_FRAME_SIZE;
Antti Palosaari80619de2008-09-15 17:18:09 -0300855 /* disable 2nd adapter because we don't have
856 PID-filters */
857 af9015_config.dual_mode = 0;
858 } else {
Antti Palosaarif0830eb2009-01-13 13:08:29 -0300859 af9015_properties[i].adapter[0].stream.u.bulk.buffersize
Jose Alberto Reguero353330c2009-09-12 09:51:36 -0300860 = TS_USB20_FRAME_SIZE;
Antti Palosaari80619de2008-09-15 17:18:09 -0300861 }
862 }
863
864 if (af9015_config.dual_mode) {
865 /* read 2nd demodulator I2C address */
866 req.addr = AF9015_EEPROM_DEMOD2_I2C;
867 ret = af9015_rw_udev(udev, &req);
868 if (ret)
869 goto error;
870 af9015_af9013_config[1].demod_address = val;
871
872 /* enable 2nd adapter */
873 for (i = 0; i < af9015_properties_count; i++)
874 af9015_properties[i].num_adapters = 2;
875
876 } else {
877 /* disable 2nd adapter */
878 for (i = 0; i < af9015_properties_count; i++)
879 af9015_properties[i].num_adapters = 1;
880 }
881
882 for (i = 0; i < af9015_properties[0].num_adapters; i++) {
883 if (i == 1)
884 offset = AF9015_EEPROM_OFFSET;
885 /* xtal */
886 req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
887 ret = af9015_rw_udev(udev, &req);
888 if (ret)
889 goto error;
890 switch (val) {
891 case 0:
892 af9015_af9013_config[i].adc_clock = 28800;
893 break;
894 case 1:
895 af9015_af9013_config[i].adc_clock = 20480;
896 break;
897 case 2:
898 af9015_af9013_config[i].adc_clock = 28000;
899 break;
900 case 3:
901 af9015_af9013_config[i].adc_clock = 25000;
902 break;
903 };
904 deb_info("%s: [%d] xtal:%d set adc_clock:%d\n", __func__, i,
905 val, af9015_af9013_config[i].adc_clock);
906
907 /* tuner IF */
908 req.addr = AF9015_EEPROM_IF1H + offset;
909 ret = af9015_rw_udev(udev, &req);
910 if (ret)
911 goto error;
912 af9015_af9013_config[i].tuner_if = val << 8;
913 req.addr = AF9015_EEPROM_IF1L + offset;
914 ret = af9015_rw_udev(udev, &req);
915 if (ret)
916 goto error;
917 af9015_af9013_config[i].tuner_if += val;
918 deb_info("%s: [%d] IF1:%d\n", __func__, i,
919 af9015_af9013_config[0].tuner_if);
920
921 /* MT2060 IF1 */
922 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
923 ret = af9015_rw_udev(udev, &req);
924 if (ret)
925 goto error;
926 af9015_config.mt2060_if1[i] = val << 8;
927 req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
928 ret = af9015_rw_udev(udev, &req);
929 if (ret)
930 goto error;
931 af9015_config.mt2060_if1[i] += val;
932 deb_info("%s: [%d] MT2060 IF1:%d\n", __func__, i,
933 af9015_config.mt2060_if1[i]);
934
935 /* tuner */
936 req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
937 ret = af9015_rw_udev(udev, &req);
938 if (ret)
939 goto error;
940 switch (val) {
941 case AF9013_TUNER_ENV77H11D5:
942 case AF9013_TUNER_MT2060:
Antti Palosaari80619de2008-09-15 17:18:09 -0300943 case AF9013_TUNER_QT1010:
944 case AF9013_TUNER_UNKNOWN:
945 case AF9013_TUNER_MT2060_2:
946 case AF9013_TUNER_TDA18271:
947 case AF9013_TUNER_QT1010A:
Antti Palosaariee3d4402010-08-13 03:51:26 -0300948 case AF9013_TUNER_TDA18218:
Antti Palosaari80619de2008-09-15 17:18:09 -0300949 af9015_af9013_config[i].rf_spec_inv = 1;
950 break;
951 case AF9013_TUNER_MXL5003D:
952 case AF9013_TUNER_MXL5005D:
953 case AF9013_TUNER_MXL5005R:
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300954 case AF9013_TUNER_MXL5007T:
Antti Palosaari80619de2008-09-15 17:18:09 -0300955 af9015_af9013_config[i].rf_spec_inv = 0;
956 break;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300957 case AF9013_TUNER_MC44S803:
958 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
959 af9015_af9013_config[i].rf_spec_inv = 1;
960 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300961 default:
962 warn("tuner id:%d not supported, please report!", val);
963 return -ENODEV;
964 };
965
966 af9015_af9013_config[i].tuner = val;
967 deb_info("%s: [%d] tuner id:%d\n", __func__, i, val);
968 }
969
970error:
971 if (ret)
972 err("eeprom read failed:%d", ret);
973
Antti Palosaari3956fef2009-03-31 17:01:02 -0300974 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -0300975 content :-( Override some wrong values here. Ditto for the
976 AVerTV Red HD+ (A850T) device. */
Antti Palosaari3956fef2009-03-31 17:01:02 -0300977 if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
Antti Palosaari9a3ecc72010-10-07 21:37:06 -0300978 ((le16_to_cpu(udev->descriptor.idProduct) ==
979 USB_PID_AVERMEDIA_A850) ||
980 (le16_to_cpu(udev->descriptor.idProduct) ==
981 USB_PID_AVERMEDIA_A850T))) {
Antti Palosaari3956fef2009-03-31 17:01:02 -0300982 deb_info("%s: AverMedia A850: overriding config\n", __func__);
983 /* disable dual mode */
984 af9015_config.dual_mode = 0;
985 /* disable 2nd adapter */
986 for (i = 0; i < af9015_properties_count; i++)
987 af9015_properties[i].num_adapters = 1;
988
989 /* set correct IF */
990 af9015_af9013_config[0].tuner_if = 4570;
991 }
992
Antti Palosaari80619de2008-09-15 17:18:09 -0300993 return ret;
994}
995
996static int af9015_identify_state(struct usb_device *udev,
997 struct dvb_usb_device_properties *props,
998 struct dvb_usb_device_description **desc,
999 int *cold)
1000{
1001 int ret;
1002 u8 reply;
1003 struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
1004
1005 ret = af9015_rw_udev(udev, &req);
1006 if (ret)
1007 return ret;
1008
1009 deb_info("%s: reply:%02x\n", __func__, reply);
1010 if (reply == 0x02)
1011 *cold = 0;
1012 else
1013 *cold = 1;
1014
1015 return ret;
1016}
1017
Antti Palosaari1cd72782010-10-12 17:22:32 -03001018static int af9015_rc_query(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -03001019{
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001020 struct af9015_state *priv = d->priv;
1021 int ret;
Ian Armstrongc1e13972011-03-18 19:23:05 -03001022 u8 buf[17];
Antti Palosaari80619de2008-09-15 17:18:09 -03001023
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001024 /* read registers needed to detect remote controller code */
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001025 ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
Antti Palosaari80619de2008-09-15 17:18:09 -03001026 if (ret)
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001027 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -03001028
Ian Armstrongc1e13972011-03-18 19:23:05 -03001029 /* If any of these are non-zero, assume invalid data */
1030 if (buf[1] || buf[2] || buf[3])
1031 return ret;
1032
1033 /* Check for repeat of previous code */
1034 if ((priv->rc_repeat != buf[6] || buf[0]) &&
1035 !memcmp(&buf[12], priv->rc_last, 4)) {
1036 deb_rc("%s: key repeated\n", __func__);
1037 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1038 priv->rc_repeat = buf[6];
1039 return ret;
1040 }
1041
1042 /* Only process key if canary killed */
1043 if (buf[16] != 0xff && buf[0] != 0x01) {
1044 /* Reset the canary */
1045 af9015_write_reg(d, 0x98e9, 0xff);
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001046 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
1047 buf[12], buf[13], buf[14], buf[15]);
Antti Palosaari80619de2008-09-15 17:18:09 -03001048
Ian Armstrongc1e13972011-03-18 19:23:05 -03001049 /* Remember this key */
1050 memcpy(priv->rc_last, &buf[12], 4);
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001051 if (buf[14] == (u8) ~buf[15]) {
1052 if (buf[12] == (u8) ~buf[13]) {
Antti Palosaari1cd72782010-10-12 17:22:32 -03001053 /* NEC */
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001054 priv->rc_keycode = buf[12] << 8 | buf[14];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001055 } else {
1056 /* NEC extended*/
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001057 priv->rc_keycode = buf[12] << 16 |
1058 buf[13] << 8 | buf[14];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001059 }
Antti Palosaari1cd72782010-10-12 17:22:32 -03001060 } else {
Ian Armstrongc1e13972011-03-18 19:23:05 -03001061 priv->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1062 buf[14] << 8 | buf[15];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001063 }
Mauro Carvalho Chehabca866742010-11-17 13:53:11 -03001064 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001065 } else {
1066 deb_rc("%s: no key press\n", __func__);
Ian Armstrongc1e13972011-03-18 19:23:05 -03001067 /* Invalidate last keypress */
1068 /* Not really needed, but helps with debug */
1069 priv->rc_last[2] = priv->rc_last[3];
Antti Palosaari80619de2008-09-15 17:18:09 -03001070 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001071
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001072 priv->rc_repeat = buf[6];
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001073
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001074error:
1075 if (ret)
1076 err("%s: failed:%d", __func__, ret);
1077
1078 return ret;
Antti Palosaari80619de2008-09-15 17:18:09 -03001079}
1080
1081/* init 2nd I2C adapter */
Antti Palosaari349d0422008-11-05 16:31:24 -03001082static int af9015_i2c_init(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -03001083{
1084 int ret;
1085 struct af9015_state *state = d->priv;
1086 deb_info("%s:\n", __func__);
1087
1088 strncpy(state->i2c_adap.name, d->desc->name,
1089 sizeof(state->i2c_adap.name));
Antti Palosaari80619de2008-09-15 17:18:09 -03001090 state->i2c_adap.algo = d->props.i2c_algo;
1091 state->i2c_adap.algo_data = NULL;
1092 state->i2c_adap.dev.parent = &d->udev->dev;
1093
1094 i2c_set_adapdata(&state->i2c_adap, d);
1095
1096 ret = i2c_add_adapter(&state->i2c_adap);
1097 if (ret < 0)
1098 err("could not add i2c adapter");
1099
1100 return ret;
1101}
1102
1103static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1104{
1105 int ret;
1106 struct af9015_state *state = adap->dev->priv;
1107 struct i2c_adapter *i2c_adap;
1108
1109 if (adap->id == 0) {
1110 /* select I2C adapter */
1111 i2c_adap = &adap->dev->i2c_adap;
1112
1113 deb_info("%s: init I2C\n", __func__);
1114 ret = af9015_i2c_init(adap->dev);
Antti Palosaari80619de2008-09-15 17:18:09 -03001115 } else {
1116 /* select I2C adapter */
1117 i2c_adap = &state->i2c_adap;
1118
1119 /* copy firmware to 2nd demodulator */
1120 if (af9015_config.dual_mode) {
1121 ret = af9015_copy_firmware(adap->dev);
1122 if (ret) {
1123 err("firmware copy to 2nd frontend " \
1124 "failed, will disable it");
1125 af9015_config.dual_mode = 0;
1126 return -ENODEV;
1127 }
1128 } else {
1129 return -ENODEV;
1130 }
1131 }
1132
1133 /* attach demodulator */
1134 adap->fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
1135 i2c_adap);
1136
1137 return adap->fe == NULL ? -ENODEV : 0;
1138}
1139
1140static struct mt2060_config af9015_mt2060_config = {
1141 .i2c_address = 0xc0,
1142 .clock_out = 0,
1143};
1144
1145static struct qt1010_config af9015_qt1010_config = {
1146 .i2c_address = 0xc4,
1147};
1148
1149static struct tda18271_config af9015_tda18271_config = {
1150 .gate = TDA18271_GATE_DIGITAL,
Mauro Carvalho Chehab7655e592010-10-27 14:55:34 -02001151 .small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
Antti Palosaari80619de2008-09-15 17:18:09 -03001152};
1153
1154static struct mxl5005s_config af9015_mxl5003_config = {
1155 .i2c_address = 0xc6,
1156 .if_freq = IF_FREQ_4570000HZ,
1157 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1158 .agc_mode = MXL_SINGLE_AGC,
1159 .tracking_filter = MXL_TF_DEFAULT,
Antti Palosaaria1310772008-09-22 13:59:25 -03001160 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -03001161 .cap_select = MXL_CAP_SEL_ENABLE,
1162 .div_out = MXL_DIV_OUT_4,
1163 .clock_out = MXL_CLOCK_OUT_DISABLE,
1164 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1165 .top = MXL5005S_TOP_25P2,
1166 .mod_mode = MXL_DIGITAL_MODE,
1167 .if_mode = MXL_ZERO_IF,
1168 .AgcMasterByte = 0x00,
1169};
1170
1171static struct mxl5005s_config af9015_mxl5005_config = {
1172 .i2c_address = 0xc6,
1173 .if_freq = IF_FREQ_4570000HZ,
1174 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1175 .agc_mode = MXL_SINGLE_AGC,
1176 .tracking_filter = MXL_TF_OFF,
Antti Palosaaria1310772008-09-22 13:59:25 -03001177 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -03001178 .cap_select = MXL_CAP_SEL_ENABLE,
1179 .div_out = MXL_DIV_OUT_4,
1180 .clock_out = MXL_CLOCK_OUT_DISABLE,
1181 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1182 .top = MXL5005S_TOP_25P2,
1183 .mod_mode = MXL_DIGITAL_MODE,
1184 .if_mode = MXL_ZERO_IF,
1185 .AgcMasterByte = 0x00,
1186};
1187
Jochen Friedrichd5633992009-02-02 14:59:50 -03001188static struct mc44s803_config af9015_mc44s803_config = {
1189 .i2c_address = 0xc0,
1190 .dig_out = 1,
1191};
1192
Antti Palosaariee3d4402010-08-13 03:51:26 -03001193static struct tda18218_config af9015_tda18218_config = {
1194 .i2c_address = 0xc0,
1195 .i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
1196};
1197
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001198static struct mxl5007t_config af9015_mxl5007t_config = {
1199 .xtal_freq_hz = MxL_XTAL_24_MHZ,
1200 .if_freq_hz = MxL_IF_4_57_MHZ,
1201};
1202
Antti Palosaari80619de2008-09-15 17:18:09 -03001203static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
1204{
1205 struct af9015_state *state = adap->dev->priv;
1206 struct i2c_adapter *i2c_adap;
1207 int ret;
Antti Palosaari9a3ecc72010-10-07 21:37:06 -03001208 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001209
1210 /* select I2C adapter */
1211 if (adap->id == 0)
1212 i2c_adap = &adap->dev->i2c_adap;
1213 else
1214 i2c_adap = &state->i2c_adap;
1215
1216 switch (af9015_af9013_config[adap->id].tuner) {
1217 case AF9013_TUNER_MT2060:
1218 case AF9013_TUNER_MT2060_2:
1219 ret = dvb_attach(mt2060_attach, adap->fe, i2c_adap,
1220 &af9015_mt2060_config,
1221 af9015_config.mt2060_if1[adap->id])
1222 == NULL ? -ENODEV : 0;
1223 break;
1224 case AF9013_TUNER_QT1010:
1225 case AF9013_TUNER_QT1010A:
1226 ret = dvb_attach(qt1010_attach, adap->fe, i2c_adap,
1227 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
1228 break;
1229 case AF9013_TUNER_TDA18271:
1230 ret = dvb_attach(tda18271_attach, adap->fe, 0xc0, i2c_adap,
1231 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
1232 break;
Antti Palosaariee3d4402010-08-13 03:51:26 -03001233 case AF9013_TUNER_TDA18218:
1234 ret = dvb_attach(tda18218_attach, adap->fe, i2c_adap,
1235 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
1236 break;
Antti Palosaari80619de2008-09-15 17:18:09 -03001237 case AF9013_TUNER_MXL5003D:
1238 ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1239 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
1240 break;
1241 case AF9013_TUNER_MXL5005D:
1242 case AF9013_TUNER_MXL5005R:
1243 ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1244 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
1245 break;
1246 case AF9013_TUNER_ENV77H11D5:
1247 ret = dvb_attach(dvb_pll_attach, adap->fe, 0xc0, i2c_adap,
1248 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
1249 break;
1250 case AF9013_TUNER_MC44S803:
Jochen Friedrichd5633992009-02-02 14:59:50 -03001251 ret = dvb_attach(mc44s803_attach, adap->fe, i2c_adap,
1252 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -03001253 break;
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001254 case AF9013_TUNER_MXL5007T:
1255 ret = dvb_attach(mxl5007t_attach, adap->fe, i2c_adap,
1256 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
1257 break;
Antti Palosaari80619de2008-09-15 17:18:09 -03001258 case AF9013_TUNER_UNKNOWN:
1259 default:
1260 ret = -ENODEV;
1261 err("Unknown tuner id:%d",
1262 af9015_af9013_config[adap->id].tuner);
1263 }
1264 return ret;
1265}
1266
1267static struct usb_device_id af9015_usb_table[] = {
1268/* 0 */{USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015)},
1269 {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016)},
1270 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD)},
1271 {USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E)},
1272 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U)},
1273/* 5 */{USB_DEVICE(USB_VID_VISIONPLUS,
1274 USB_PID_TINYTWIN)},
1275 {USB_DEVICE(USB_VID_VISIONPLUS,
1276 USB_PID_AZUREWAVE_AD_TU700)},
1277 {USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2)},
1278 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T)},
1279 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X)},
1280/* 10 */{USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380)},
1281 {USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO)},
1282 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2)},
Antti Palosaaria3765882008-09-19 18:34:06 -03001283 {USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2)},
Antti Palosaari05c1cab2008-09-22 12:32:37 -03001284 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309)},
Herbert Graeber641015a2008-10-07 10:06:36 -03001285/* 15 */{USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III)},
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001286 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U)},
Antti Palosaari71bf2e02009-01-13 12:47:28 -03001287 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)},
Antti Palosaari58fe1592009-03-26 20:41:05 -03001288 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)},
Marc Schneider26144842009-03-26 21:07:18 -03001289 {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)},
Antti Palosaari1ed5fad2009-04-09 15:14:18 -03001290/* 20 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)},
1291 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)},
Marcel Jueling734dd232009-04-09 17:16:41 -03001292 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)},
Wen-chien Jesse Sung6e9c1a22009-04-28 01:11:22 -03001293 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
Antti Palosaari22d46452009-05-31 17:07:01 -03001294 {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
Mart Raudseppc92f0562009-07-24 13:45:41 -03001295/* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
Antti Palosaari486ba122009-09-18 13:37:57 -03001296 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)},
Ignacio de Miguel Diaz52322632009-11-13 23:13:34 -03001297 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)},
Antti Palosaarifa1df552010-02-10 20:05:48 -03001298 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2)},
Antti Palosaari809c1e82010-02-10 20:07:30 -03001299 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS)},
Antti Palosaariab9b4f22010-03-01 13:50:40 -03001300/* 30 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T)},
Antti Palosaari7fc87092010-03-01 14:06:52 -03001301 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4)},
Antti Palosaari2606cfa2010-05-23 18:26:37 -03001302 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M)},
Stefan Lippers-Hollmannd7ef4852010-08-25 10:08:48 -03001303 {USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_RC)},
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001304 {USB_DEVICE(USB_VID_TERRATEC,
1305 USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC)},
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001306/* 35 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T)},
Antti Palosaarif8c61272010-10-23 07:35:31 -03001307 {USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3)},
Antti Palosaari80619de2008-09-15 17:18:09 -03001308 {0},
1309};
1310MODULE_DEVICE_TABLE(usb, af9015_usb_table);
1311
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001312#define AF9015_RC_INTERVAL 500
Antti Palosaari80619de2008-09-15 17:18:09 -03001313static struct dvb_usb_device_properties af9015_properties[] = {
1314 {
1315 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1316
1317 .usb_ctrl = DEVICE_SPECIFIC,
1318 .download_firmware = af9015_download_firmware,
1319 .firmware = "dvb-usb-af9015.fw",
Jose Alberto Reguerocce25712008-11-13 14:14:18 -03001320 .no_reconnect = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001321
Antti Palosaari02542942009-09-16 20:33:03 -03001322 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari80619de2008-09-15 17:18:09 -03001323
1324 .num_adapters = 2,
1325 .adapter = {
1326 {
1327 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1328 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1329
1330 .pid_filter_count = 32,
1331 .pid_filter = af9015_pid_filter,
1332 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1333
1334 .frontend_attach =
1335 af9015_af9013_frontend_attach,
1336 .tuner_attach = af9015_tuner_attach,
1337 .stream = {
1338 .type = USB_BULK,
1339 .count = 6,
1340 .endpoint = 0x84,
1341 },
1342 },
1343 {
1344 .frontend_attach =
1345 af9015_af9013_frontend_attach,
1346 .tuner_attach = af9015_tuner_attach,
1347 .stream = {
1348 .type = USB_BULK,
1349 .count = 6,
1350 .endpoint = 0x85,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001351 .u = {
1352 .bulk = {
1353 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001354 TS_USB20_FRAME_SIZE,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001355 }
1356 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001357 },
1358 }
1359 },
1360
1361 .identify_state = af9015_identify_state,
1362
Antti Palosaari1cd72782010-10-12 17:22:32 -03001363 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001364 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001365 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001366 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001367 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001368 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001369 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001370
1371 .i2c_algo = &af9015_i2c_algo,
1372
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001373 .num_device_descs = 12, /* check max from dvb-usb.h */
Antti Palosaari80619de2008-09-15 17:18:09 -03001374 .devices = {
1375 {
1376 .name = "Afatech AF9015 DVB-T USB2.0 stick",
1377 .cold_ids = {&af9015_usb_table[0],
1378 &af9015_usb_table[1], NULL},
1379 .warm_ids = {NULL},
1380 },
1381 {
1382 .name = "Leadtek WinFast DTV Dongle Gold",
1383 .cold_ids = {&af9015_usb_table[2], NULL},
1384 .warm_ids = {NULL},
1385 },
1386 {
1387 .name = "Pinnacle PCTV 71e",
1388 .cold_ids = {&af9015_usb_table[3], NULL},
1389 .warm_ids = {NULL},
1390 },
1391 {
1392 .name = "KWorld PlusTV Dual DVB-T Stick " \
1393 "(DVB-T 399U)",
Mart Raudseppc92f0562009-07-24 13:45:41 -03001394 .cold_ids = {&af9015_usb_table[4],
1395 &af9015_usb_table[25], NULL},
Antti Palosaari80619de2008-09-15 17:18:09 -03001396 .warm_ids = {NULL},
1397 },
1398 {
1399 .name = "DigitalNow TinyTwin DVB-T Receiver",
Antti Palosaarifa1df552010-02-10 20:05:48 -03001400 .cold_ids = {&af9015_usb_table[5],
Antti Palosaarif8c61272010-10-23 07:35:31 -03001401 &af9015_usb_table[28],
1402 &af9015_usb_table[36], NULL},
Antti Palosaari80619de2008-09-15 17:18:09 -03001403 .warm_ids = {NULL},
1404 },
1405 {
1406 .name = "TwinHan AzureWave AD-TU700(704J)",
1407 .cold_ids = {&af9015_usb_table[6], NULL},
1408 .warm_ids = {NULL},
1409 },
1410 {
1411 .name = "TerraTec Cinergy T USB XE",
1412 .cold_ids = {&af9015_usb_table[7], NULL},
1413 .warm_ids = {NULL},
1414 },
1415 {
1416 .name = "KWorld PlusTV Dual DVB-T PCI " \
1417 "(DVB-T PC160-2T)",
1418 .cold_ids = {&af9015_usb_table[8], NULL},
1419 .warm_ids = {NULL},
1420 },
1421 {
1422 .name = "AVerMedia AVerTV DVB-T Volar X",
1423 .cold_ids = {&af9015_usb_table[9], NULL},
1424 .warm_ids = {NULL},
1425 },
Antti Palosaari76391a72010-09-09 12:10:50 -03001426 {
1427 .name = "TerraTec Cinergy T Stick RC",
1428 .cold_ids = {&af9015_usb_table[33], NULL},
1429 .warm_ids = {NULL},
1430 },
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001431 {
1432 .name = "TerraTec Cinergy T Stick Dual RC",
1433 .cold_ids = {&af9015_usb_table[34], NULL},
1434 .warm_ids = {NULL},
1435 },
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001436 {
1437 .name = "AverMedia AVerTV Red HD+ (A850T)",
1438 .cold_ids = {&af9015_usb_table[35], NULL},
1439 .warm_ids = {NULL},
1440 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001441 }
1442 }, {
1443 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1444
1445 .usb_ctrl = DEVICE_SPECIFIC,
1446 .download_firmware = af9015_download_firmware,
1447 .firmware = "dvb-usb-af9015.fw",
Jose Alberto Reguerocce25712008-11-13 14:14:18 -03001448 .no_reconnect = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001449
Antti Palosaari02542942009-09-16 20:33:03 -03001450 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari80619de2008-09-15 17:18:09 -03001451
1452 .num_adapters = 2,
1453 .adapter = {
1454 {
1455 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1456 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1457
1458 .pid_filter_count = 32,
1459 .pid_filter = af9015_pid_filter,
1460 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1461
1462 .frontend_attach =
1463 af9015_af9013_frontend_attach,
1464 .tuner_attach = af9015_tuner_attach,
1465 .stream = {
1466 .type = USB_BULK,
1467 .count = 6,
1468 .endpoint = 0x84,
1469 },
1470 },
1471 {
1472 .frontend_attach =
1473 af9015_af9013_frontend_attach,
1474 .tuner_attach = af9015_tuner_attach,
1475 .stream = {
1476 .type = USB_BULK,
1477 .count = 6,
1478 .endpoint = 0x85,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001479 .u = {
1480 .bulk = {
1481 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001482 TS_USB20_FRAME_SIZE,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001483 }
1484 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001485 },
1486 }
1487 },
1488
1489 .identify_state = af9015_identify_state,
1490
Antti Palosaari1cd72782010-10-12 17:22:32 -03001491 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001492 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001493 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001494 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001495 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001496 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001497 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001498
1499 .i2c_algo = &af9015_i2c_algo,
1500
Antti Palosaaria44b91d2010-09-09 12:05:31 -03001501 .num_device_descs = 9, /* check max from dvb-usb.h */
Antti Palosaari80619de2008-09-15 17:18:09 -03001502 .devices = {
1503 {
1504 .name = "Xtensions XD-380",
1505 .cold_ids = {&af9015_usb_table[10], NULL},
1506 .warm_ids = {NULL},
1507 },
1508 {
1509 .name = "MSI DIGIVOX Duo",
1510 .cold_ids = {&af9015_usb_table[11], NULL},
1511 .warm_ids = {NULL},
1512 },
1513 {
1514 .name = "Fujitsu-Siemens Slim Mobile USB DVB-T",
1515 .cold_ids = {&af9015_usb_table[12], NULL},
1516 .warm_ids = {NULL},
1517 },
Mikko Ohtamaa111f9ec2008-09-19 18:26:05 -03001518 {
Antti Palosaaria3765882008-09-19 18:34:06 -03001519 .name = "Telestar Starstick 2",
Mikko Ohtamaa111f9ec2008-09-19 18:26:05 -03001520 .cold_ids = {&af9015_usb_table[13], NULL},
1521 .warm_ids = {NULL},
1522 },
Antti Palosaari05c1cab2008-09-22 12:32:37 -03001523 {
1524 .name = "AVerMedia A309",
1525 .cold_ids = {&af9015_usb_table[14], NULL},
1526 .warm_ids = {NULL},
1527 },
Herbert Graeber641015a2008-10-07 10:06:36 -03001528 {
1529 .name = "MSI Digi VOX mini III",
1530 .cold_ids = {&af9015_usb_table[15], NULL},
1531 .warm_ids = {NULL},
1532 },
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001533 {
1534 .name = "KWorld USB DVB-T TV Stick II " \
1535 "(VS-DVB-T 395U)",
Antti Palosaari71bf2e02009-01-13 12:47:28 -03001536 .cold_ids = {&af9015_usb_table[16],
Antti Palosaari58fe1592009-03-26 20:41:05 -03001537 &af9015_usb_table[17],
Antti Palosaari7fc87092010-03-01 14:06:52 -03001538 &af9015_usb_table[18],
1539 &af9015_usb_table[31], NULL},
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001540 .warm_ids = {NULL},
1541 },
Marc Schneider26144842009-03-26 21:07:18 -03001542 {
1543 .name = "TrekStor DVB-T USB Stick",
1544 .cold_ids = {&af9015_usb_table[19], NULL},
1545 .warm_ids = {NULL},
1546 },
Antti Palosaari3956fef2009-03-31 17:01:02 -03001547 {
1548 .name = "AverMedia AVerTV Volar Black HD " \
1549 "(A850)",
1550 .cold_ids = {&af9015_usb_table[20], NULL},
1551 .warm_ids = {NULL},
1552 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001553 }
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001554 }, {
1555 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1556
1557 .usb_ctrl = DEVICE_SPECIFIC,
1558 .download_firmware = af9015_download_firmware,
1559 .firmware = "dvb-usb-af9015.fw",
1560 .no_reconnect = 1,
1561
Antti Palosaari02542942009-09-16 20:33:03 -03001562 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001563
1564 .num_adapters = 2,
1565 .adapter = {
1566 {
1567 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1568 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1569
1570 .pid_filter_count = 32,
1571 .pid_filter = af9015_pid_filter,
1572 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1573
1574 .frontend_attach =
1575 af9015_af9013_frontend_attach,
1576 .tuner_attach = af9015_tuner_attach,
1577 .stream = {
1578 .type = USB_BULK,
1579 .count = 6,
1580 .endpoint = 0x84,
1581 },
1582 },
1583 {
1584 .frontend_attach =
1585 af9015_af9013_frontend_attach,
1586 .tuner_attach = af9015_tuner_attach,
1587 .stream = {
1588 .type = USB_BULK,
1589 .count = 6,
1590 .endpoint = 0x85,
1591 .u = {
1592 .bulk = {
1593 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001594 TS_USB20_FRAME_SIZE,
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001595 }
1596 }
1597 },
1598 }
1599 },
1600
1601 .identify_state = af9015_identify_state,
1602
Antti Palosaari1cd72782010-10-12 17:22:32 -03001603 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001604 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001605 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001606 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001607 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001608 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001609 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001610
1611 .i2c_algo = &af9015_i2c_algo,
1612
Antti Palosaaria44b91d2010-09-09 12:05:31 -03001613 .num_device_descs = 9, /* check max from dvb-usb.h */
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001614 .devices = {
Antti Palosaari1ed5fad2009-04-09 15:14:18 -03001615 {
1616 .name = "AverMedia AVerTV Volar GPS 805 (A805)",
1617 .cold_ids = {&af9015_usb_table[21], NULL},
1618 .warm_ids = {NULL},
1619 },
Marcel Jueling734dd232009-04-09 17:16:41 -03001620 {
1621 .name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1622 "V3.0",
1623 .cold_ids = {&af9015_usb_table[22], NULL},
1624 .warm_ids = {NULL},
1625 },
Wen-chien Jesse Sung6e9c1a22009-04-28 01:11:22 -03001626 {
1627 .name = "KWorld Digial MC-810",
1628 .cold_ids = {&af9015_usb_table[23], NULL},
1629 .warm_ids = {NULL},
1630 },
Antti Palosaari22d46452009-05-31 17:07:01 -03001631 {
1632 .name = "Genius TVGo DVB-T03",
1633 .cold_ids = {&af9015_usb_table[24], NULL},
1634 .warm_ids = {NULL},
1635 },
Antti Palosaari486ba122009-09-18 13:37:57 -03001636 {
1637 .name = "KWorld PlusTV DVB-T PCI Pro Card " \
1638 "(DVB-T PC160-T)",
1639 .cold_ids = {&af9015_usb_table[26], NULL},
1640 .warm_ids = {NULL},
1641 },
Ignacio de Miguel Diaz52322632009-11-13 23:13:34 -03001642 {
1643 .name = "Sveon STV20 Tuner USB DVB-T HDTV",
1644 .cold_ids = {&af9015_usb_table[27], NULL},
1645 .warm_ids = {NULL},
1646 },
Antti Palosaari809c1e82010-02-10 20:07:30 -03001647 {
1648 .name = "Leadtek WinFast DTV2000DS",
1649 .cold_ids = {&af9015_usb_table[29], NULL},
1650 .warm_ids = {NULL},
1651 },
Antti Palosaariab9b4f22010-03-01 13:50:40 -03001652 {
1653 .name = "KWorld USB DVB-T Stick Mobile " \
1654 "(UB383-T)",
1655 .cold_ids = {&af9015_usb_table[30], NULL},
1656 .warm_ids = {NULL},
1657 },
Antti Palosaari2606cfa2010-05-23 18:26:37 -03001658 {
1659 .name = "AverMedia AVerTV Volar M (A815Mac)",
1660 .cold_ids = {&af9015_usb_table[32], NULL},
1661 .warm_ids = {NULL},
1662 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001663 }
1664 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001665};
Antti Palosaari80619de2008-09-15 17:18:09 -03001666
1667static int af9015_usb_probe(struct usb_interface *intf,
1668 const struct usb_device_id *id)
1669{
1670 int ret = 0;
1671 struct dvb_usb_device *d = NULL;
1672 struct usb_device *udev = interface_to_usbdev(intf);
1673 u8 i;
1674
1675 deb_info("%s: interface:%d\n", __func__,
1676 intf->cur_altsetting->desc.bInterfaceNumber);
1677
1678 /* interface 0 is used by DVB-T receiver and
1679 interface 1 is for remote controller (HID) */
1680 if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
1681 ret = af9015_read_config(udev);
1682 if (ret)
1683 return ret;
1684
1685 for (i = 0; i < af9015_properties_count; i++) {
1686 ret = dvb_usb_device_init(intf, &af9015_properties[i],
1687 THIS_MODULE, &d, adapter_nr);
1688 if (!ret)
1689 break;
1690 if (ret != -ENODEV)
1691 return ret;
1692 }
1693 if (ret)
1694 return ret;
1695
1696 if (d)
1697 ret = af9015_init(d);
1698 }
1699
1700 return ret;
1701}
1702
Antti Palosaari349d0422008-11-05 16:31:24 -03001703static void af9015_i2c_exit(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -03001704{
1705 struct af9015_state *state = d->priv;
Antti Palosaari9a3ecc72010-10-07 21:37:06 -03001706 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001707
1708 /* remove 2nd I2C adapter */
1709 if (d->state & DVB_USB_STATE_I2C)
1710 i2c_del_adapter(&state->i2c_adap);
1711}
1712
1713static void af9015_usb_device_exit(struct usb_interface *intf)
1714{
1715 struct dvb_usb_device *d = usb_get_intfdata(intf);
Antti Palosaari9a3ecc72010-10-07 21:37:06 -03001716 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001717
1718 /* remove 2nd I2C adapter */
1719 if (d != NULL && d->desc != NULL)
1720 af9015_i2c_exit(d);
1721
1722 dvb_usb_device_exit(intf);
1723}
1724
1725/* usb specific object needed to register this driver with the usb subsystem */
1726static struct usb_driver af9015_usb_driver = {
1727 .name = "dvb_usb_af9015",
1728 .probe = af9015_usb_probe,
1729 .disconnect = af9015_usb_device_exit,
1730 .id_table = af9015_usb_table,
1731};
1732
1733/* module stuff */
1734static int __init af9015_usb_module_init(void)
1735{
1736 int ret;
1737 ret = usb_register(&af9015_usb_driver);
1738 if (ret)
1739 err("module init failed:%d", ret);
1740
1741 return ret;
1742}
1743
1744static void __exit af9015_usb_module_exit(void)
1745{
1746 /* deregister this driver from the USB subsystem */
1747 usb_deregister(&af9015_usb_driver);
1748}
1749
1750module_init(af9015_usb_module_init);
1751module_exit(af9015_usb_module_exit);
1752
1753MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1754MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1755MODULE_LICENSE("GPL");