blob: 0bfe83b63e0168ae0ccc66688546c9e1464e5799 [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) {
Jochen Friedrichd5633992009-02-02 14:59:50 -0300309 if (msg[i].addr ==
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300310 af9015_af9013_config[0].demod_address) {
311 ret = -EINVAL;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300312 goto error;
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300313 }
314 req.cmd = READ_I2C;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300315 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);
Antti Palosaari1e8750c2011-03-18 19:36:42 -0300482
Antti Palosaari80619de2008-09-15 17:18:09 -0300483error:
484 if (ret)
485 err("endpoint init failed:%d", ret);
486 return ret;
487}
488
489static int af9015_copy_firmware(struct dvb_usb_device *d)
490{
491 int ret;
492 u8 fw_params[4];
493 u8 val, i;
494 struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
495 fw_params };
496 deb_info("%s:\n", __func__);
497
498 fw_params[0] = af9015_config.firmware_size >> 8;
499 fw_params[1] = af9015_config.firmware_size & 0xff;
500 fw_params[2] = af9015_config.firmware_checksum >> 8;
501 fw_params[3] = af9015_config.firmware_checksum & 0xff;
502
503 /* wait 2nd demodulator ready */
504 msleep(100);
505
Antti Palosaaried19a5d2010-09-12 21:02:55 -0300506 ret = af9015_read_reg_i2c(d,
507 af9015_af9013_config[1].demod_address, 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300508 if (ret)
509 goto error;
510 else
511 deb_info("%s: firmware status:%02x\n", __func__, val);
512
513 if (val == 0x0c) /* fw is running, no need for download */
514 goto exit;
515
516 /* set I2C master clock to fast (to speed up firmware copy) */
517 ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
518 if (ret)
519 goto error;
520
521 msleep(50);
522
523 /* copy firmware */
524 ret = af9015_ctrl_msg(d, &req);
525 if (ret)
526 err("firmware copy cmd failed:%d", ret);
527 deb_info("%s: firmware copy done\n", __func__);
528
529 /* set I2C master clock back to normal */
530 ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
531 if (ret)
532 goto error;
533
534 /* request boot firmware */
535 ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].demod_address,
536 0xe205, 1);
537 deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
538 if (ret)
539 goto error;
540
541 for (i = 0; i < 15; i++) {
542 msleep(100);
543
544 /* check firmware status */
545 ret = af9015_read_reg_i2c(d,
546 af9015_af9013_config[1].demod_address, 0x98be, &val);
547 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
548 __func__, ret, val);
549 if (ret)
550 goto error;
551
552 if (val == 0x0c || val == 0x04) /* success or fail */
553 break;
554 }
555
556 if (val == 0x04) {
557 err("firmware did not run");
558 ret = -1;
559 } else if (val != 0x0c) {
560 err("firmware boot timeout");
561 ret = -1;
562 }
563
564error:
565exit:
566 return ret;
567}
568
Jiri Slaby6c614042010-01-22 12:10:52 -0300569/* hash (and dump) eeprom */
570static int af9015_eeprom_hash(struct usb_device *udev)
Antti Palosaari80619de2008-09-15 17:18:09 -0300571{
Jiri Slaby6c614042010-01-22 12:10:52 -0300572 static const unsigned int eeprom_size = 256;
573 unsigned int reg;
574 int ret;
575 u8 val, *eeprom;
576 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
Antti Palosaari80619de2008-09-15 17:18:09 -0300577
Jiri Slaby6c614042010-01-22 12:10:52 -0300578 eeprom = kmalloc(eeprom_size, GFP_KERNEL);
579 if (eeprom == NULL)
580 return -ENOMEM;
581
582 for (reg = 0; reg < eeprom_size; reg++) {
583 req.addr = reg;
584 ret = af9015_rw_udev(udev, &req);
585 if (ret)
586 goto free;
587 eeprom[reg] = val;
Antti Palosaari80619de2008-09-15 17:18:09 -0300588 }
Jiri Slaby6c614042010-01-22 12:10:52 -0300589
590 if (dvb_usb_af9015_debug & 0x01)
591 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, eeprom,
592 eeprom_size);
593
594 BUG_ON(eeprom_size % 4);
595
596 af9015_config.eeprom_sum = 0;
597 for (reg = 0; reg < eeprom_size / sizeof(u32); reg++) {
598 af9015_config.eeprom_sum *= GOLDEN_RATIO_PRIME_32;
599 af9015_config.eeprom_sum += le32_to_cpu(((u32 *)eeprom)[reg]);
600 }
601
602 deb_info("%s: eeprom sum=%.8x\n", __func__, af9015_config.eeprom_sum);
603
604 ret = 0;
605free:
606 kfree(eeprom);
607 return ret;
Antti Palosaari80619de2008-09-15 17:18:09 -0300608}
609
Antti Palosaari80619de2008-09-15 17:18:09 -0300610static int af9015_init(struct dvb_usb_device *d)
611{
612 int ret;
613 deb_info("%s:\n", __func__);
614
Antti Palosaari1e8750c2011-03-18 19:36:42 -0300615 /* init RC canary */
616 ret = af9015_write_reg(d, 0x98e9, 0xff);
617 if (ret)
618 goto error;
619
Antti Palosaari80619de2008-09-15 17:18:09 -0300620 ret = af9015_init_endpoint(d);
621 if (ret)
622 goto error;
623
Antti Palosaari80619de2008-09-15 17:18:09 -0300624error:
625 return ret;
626}
627
628static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
629{
630 int ret;
631 deb_info("%s: onoff:%d\n", __func__, onoff);
632
633 if (onoff)
634 ret = af9015_set_reg_bit(adap->dev, 0xd503, 0);
635 else
636 ret = af9015_clear_reg_bit(adap->dev, 0xd503, 0);
637
638 return ret;
639}
640
641static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
642 int onoff)
643{
644 int ret;
645 u8 idx;
646
647 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
648 __func__, index, pid, onoff);
649
650 ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
651 if (ret)
652 goto error;
653
654 ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
655 if (ret)
656 goto error;
657
658 idx = ((index & 0x1f) | (1 << 5));
659 ret = af9015_write_reg(adap->dev, 0xd504, idx);
660
661error:
662 return ret;
663}
664
665static int af9015_download_firmware(struct usb_device *udev,
666 const struct firmware *fw)
667{
Antti Palosaari582e5652011-03-19 16:51:43 -0300668 int i, len, remaining, ret;
Antti Palosaari80619de2008-09-15 17:18:09 -0300669 struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL};
Antti Palosaari80619de2008-09-15 17:18:09 -0300670 u16 checksum = 0;
671
672 deb_info("%s:\n", __func__);
673
674 /* calc checksum */
675 for (i = 0; i < fw->size; i++)
676 checksum += fw->data[i];
677
678 af9015_config.firmware_size = fw->size;
679 af9015_config.firmware_checksum = checksum;
680
Antti Palosaari582e5652011-03-19 16:51:43 -0300681 #define FW_ADDR 0x5100 /* firmware start address */
682 #define LEN_MAX 55 /* max packet size */
683 for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) {
684 len = remaining;
685 if (len > LEN_MAX)
686 len = LEN_MAX;
Antti Palosaari80619de2008-09-15 17:18:09 -0300687
688 req.data_len = len;
Antti Palosaari582e5652011-03-19 16:51:43 -0300689 req.data = (u8 *) &fw->data[fw->size - remaining];
690 req.addr = FW_ADDR + fw->size - remaining;
Antti Palosaari80619de2008-09-15 17:18:09 -0300691
692 ret = af9015_rw_udev(udev, &req);
693 if (ret) {
Antti Palosaari582e5652011-03-19 16:51:43 -0300694 err("firmware download failed:%d", ret);
Antti Palosaari80619de2008-09-15 17:18:09 -0300695 goto error;
696 }
697 }
Antti Palosaari80619de2008-09-15 17:18:09 -0300698
699 /* firmware loaded, request boot */
700 req.cmd = BOOT;
701 ret = af9015_rw_udev(udev, &req);
702 if (ret) {
703 err("firmware boot failed:%d", ret);
704 goto error;
705 }
706
Antti Palosaari80619de2008-09-15 17:18:09 -0300707error:
708 return ret;
709}
710
Antti Palosaari1cd72782010-10-12 17:22:32 -0300711struct af9015_rc_setup {
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300712 unsigned int id;
Antti Palosaari1cd72782010-10-12 17:22:32 -0300713 char *rc_codes;
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300714};
715
Antti Palosaari1cd72782010-10-12 17:22:32 -0300716static char *af9015_rc_setup_match(unsigned int id,
717 const struct af9015_rc_setup *table)
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300718{
Antti Palosaari1cd72782010-10-12 17:22:32 -0300719 for (; table->rc_codes; table++)
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300720 if (table->id == id)
Antti Palosaari1cd72782010-10-12 17:22:32 -0300721 return table->rc_codes;
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300722 return NULL;
723}
724
Antti Palosaari1cd72782010-10-12 17:22:32 -0300725static const struct af9015_rc_setup af9015_rc_setup_modparam[] = {
726 { AF9015_REMOTE_A_LINK_DTU_M, RC_MAP_ALINK_DTU_M },
727 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, RC_MAP_MSI_DIGIVOX_II },
728 { AF9015_REMOTE_MYGICTV_U718, RC_MAP_TOTAL_MEDIA_IN_HAND },
729 { AF9015_REMOTE_DIGITTRADE_DVB_T, RC_MAP_DIGITTRADE },
730 { AF9015_REMOTE_AVERMEDIA_KS, RC_MAP_AVERMEDIA_RM_KS },
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300731 { }
732};
733
Antti Palosaari1cd72782010-10-12 17:22:32 -0300734static const struct af9015_rc_setup af9015_rc_setup_hashes[] = {
735 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II },
736 { 0xa3703d00, RC_MAP_ALINK_DTU_M },
737 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND }, /* MYGICTV U718 */
Juergen Lock879b0d72011-06-12 17:25:12 -0300738 { 0x5d49e3db, RC_MAP_DIGITTRADE }, /* LC-Power LC-USB-DVBT */
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300739 { }
740};
741
Antti Palosaari1cd72782010-10-12 17:22:32 -0300742static const struct af9015_rc_setup af9015_rc_setup_usbids[] = {
Antti Palosaari04599c22011-03-19 14:25:36 -0300743 { (USB_VID_TERRATEC << 16) + USB_PID_TERRATEC_CINERGY_T_STICK_RC,
744 RC_MAP_TERRATEC_SLIM_2 },
Antti Palosaari1cd72782010-10-12 17:22:32 -0300745 { (USB_VID_TERRATEC << 16) + USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
746 RC_MAP_TERRATEC_SLIM },
747 { (USB_VID_VISIONPLUS << 16) + USB_PID_AZUREWAVE_AD_TU700,
748 RC_MAP_AZUREWAVE_AD_TU700 },
749 { (USB_VID_VISIONPLUS << 16) + USB_PID_TINYTWIN,
750 RC_MAP_AZUREWAVE_AD_TU700 },
751 { (USB_VID_MSI_2 << 16) + USB_PID_MSI_DIGI_VOX_MINI_III,
752 RC_MAP_MSI_DIGIVOX_III },
Antti Palosaariae81aab2011-06-15 11:29:47 -0300753 { (USB_VID_MSI_2 << 16) + USB_PID_MSI_DIGIVOX_DUO,
754 RC_MAP_MSI_DIGIVOX_III },
Antti Palosaari1cd72782010-10-12 17:22:32 -0300755 { (USB_VID_LEADTEK << 16) + USB_PID_WINFAST_DTV_DONGLE_GOLD,
756 RC_MAP_LEADTEK_Y04G0051 },
757 { (USB_VID_AVERMEDIA << 16) + USB_PID_AVERMEDIA_VOLAR_X,
758 RC_MAP_AVERMEDIA_M135A },
759 { (USB_VID_AFATECH << 16) + USB_PID_TREKSTOR_DVBT,
760 RC_MAP_TREKSTOR },
Antti Palosaaribd864ce2010-10-22 20:37:11 -0300761 { (USB_VID_KWORLD_2 << 16) + USB_PID_TINYTWIN_2,
762 RC_MAP_DIGITALNOW_TINYTWIN },
Antti Palosaarif8c61272010-10-23 07:35:31 -0300763 { (USB_VID_GTEK << 16) + USB_PID_TINYTWIN_3,
764 RC_MAP_DIGITALNOW_TINYTWIN },
Jiri Slabye3a0cc62010-01-22 12:10:55 -0300765 { }
766};
767
Jiri Slaby634d2d72010-01-22 12:10:53 -0300768static void af9015_set_remote_config(struct usb_device *udev,
769 struct dvb_usb_device_properties *props)
770{
Antti Palosaari1cd72782010-10-12 17:22:32 -0300771 u16 vid = le16_to_cpu(udev->descriptor.idVendor);
772 u16 pid = le16_to_cpu(udev->descriptor.idProduct);
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300773
Antti Palosaari1cd72782010-10-12 17:22:32 -0300774 /* try to load remote based module param */
775 props->rc.core.rc_codes = af9015_rc_setup_match(
776 dvb_usb_af9015_remote, af9015_rc_setup_modparam);
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300777
Antti Palosaari1cd72782010-10-12 17:22:32 -0300778 /* try to load remote based eeprom hash */
779 if (!props->rc.core.rc_codes)
780 props->rc.core.rc_codes = af9015_rc_setup_match(
781 af9015_config.eeprom_sum, af9015_rc_setup_hashes);
Jiri Slabye3a0cc62010-01-22 12:10:55 -0300782
Antti Palosaari1cd72782010-10-12 17:22:32 -0300783 /* try to load remote based USB ID */
784 if (!props->rc.core.rc_codes)
785 props->rc.core.rc_codes = af9015_rc_setup_match(
786 (vid << 16) + pid, af9015_rc_setup_usbids);
787
788 /* try to load remote based USB iManufacturer string */
789 if (!props->rc.core.rc_codes && vid == USB_VID_AFATECH) {
790 /* Check USB manufacturer and product strings and try
791 to determine correct remote in case of chip vendor
792 reference IDs are used.
793 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
794 char manufacturer[10];
795 memset(manufacturer, 0, sizeof(manufacturer));
796 usb_string(udev, udev->descriptor.iManufacturer,
797 manufacturer, sizeof(manufacturer));
798 if (!strcmp("MSI", manufacturer)) {
799 /* iManufacturer 1 MSI
800 iProduct 2 MSI K-VOX */
801 props->rc.core.rc_codes = af9015_rc_setup_match(
802 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
803 af9015_rc_setup_modparam);
804 }
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300805 }
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300806
807 /* finally load "empty" just for leaving IR receiver enabled */
808 if (!props->rc.core.rc_codes)
809 props->rc.core.rc_codes = RC_MAP_EMPTY;
810
Antti Palosaari1cd72782010-10-12 17:22:32 -0300811 return;
Jiri Slaby634d2d72010-01-22 12:10:53 -0300812}
813
Antti Palosaari80619de2008-09-15 17:18:09 -0300814static int af9015_read_config(struct usb_device *udev)
815{
816 int ret;
817 u8 val, i, offset = 0;
818 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
Antti Palosaari80619de2008-09-15 17:18:09 -0300819
820 /* IR remote controller */
821 req.addr = AF9015_EEPROM_IR_MODE;
Antti Palosaarid1a470f2009-01-20 14:56:20 -0300822 /* first message will timeout often due to possible hw bug */
823 for (i = 0; i < 4; i++) {
824 ret = af9015_rw_udev(udev, &req);
825 if (!ret)
826 break;
827 }
Antti Palosaari80619de2008-09-15 17:18:09 -0300828 if (ret)
829 goto error;
Jiri Slaby6c614042010-01-22 12:10:52 -0300830
831 ret = af9015_eeprom_hash(udev);
832 if (ret)
833 goto error;
834
Antti Palosaari80619de2008-09-15 17:18:09 -0300835 deb_info("%s: IR mode:%d\n", __func__, val);
836 for (i = 0; i < af9015_properties_count; i++) {
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300837 if (val == AF9015_IR_MODE_DISABLED)
838 af9015_properties[i].rc.core.rc_codes = NULL;
839 else
Jiri Slaby634d2d72010-01-22 12:10:53 -0300840 af9015_set_remote_config(udev, &af9015_properties[i]);
Antti Palosaari80619de2008-09-15 17:18:09 -0300841 }
842
843 /* TS mode - one or two receivers */
844 req.addr = AF9015_EEPROM_TS_MODE;
845 ret = af9015_rw_udev(udev, &req);
846 if (ret)
847 goto error;
848 af9015_config.dual_mode = val;
849 deb_info("%s: TS mode:%d\n", __func__, af9015_config.dual_mode);
Antti Palosaari80619de2008-09-15 17:18:09 -0300850
Antti Palosaarif0830eb2009-01-13 13:08:29 -0300851 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
852 size can be static because it is enabled only USB2.0 */
Antti Palosaari80619de2008-09-15 17:18:09 -0300853 for (i = 0; i < af9015_properties_count; i++) {
854 /* USB1.1 set smaller buffersize and disable 2nd adapter */
855 if (udev->speed == USB_SPEED_FULL) {
Antti Palosaarif0830eb2009-01-13 13:08:29 -0300856 af9015_properties[i].adapter[0].stream.u.bulk.buffersize
Antti Palosaari9c863272009-09-12 13:35:29 -0300857 = TS_USB11_FRAME_SIZE;
Antti Palosaari80619de2008-09-15 17:18:09 -0300858 /* disable 2nd adapter because we don't have
859 PID-filters */
860 af9015_config.dual_mode = 0;
861 } else {
Antti Palosaarif0830eb2009-01-13 13:08:29 -0300862 af9015_properties[i].adapter[0].stream.u.bulk.buffersize
Jose Alberto Reguero353330c2009-09-12 09:51:36 -0300863 = TS_USB20_FRAME_SIZE;
Antti Palosaari80619de2008-09-15 17:18:09 -0300864 }
865 }
866
867 if (af9015_config.dual_mode) {
868 /* read 2nd demodulator I2C address */
869 req.addr = AF9015_EEPROM_DEMOD2_I2C;
870 ret = af9015_rw_udev(udev, &req);
871 if (ret)
872 goto error;
873 af9015_af9013_config[1].demod_address = val;
874
875 /* enable 2nd adapter */
876 for (i = 0; i < af9015_properties_count; i++)
877 af9015_properties[i].num_adapters = 2;
878
879 } else {
880 /* disable 2nd adapter */
881 for (i = 0; i < af9015_properties_count; i++)
882 af9015_properties[i].num_adapters = 1;
883 }
884
885 for (i = 0; i < af9015_properties[0].num_adapters; i++) {
886 if (i == 1)
887 offset = AF9015_EEPROM_OFFSET;
888 /* xtal */
889 req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
890 ret = af9015_rw_udev(udev, &req);
891 if (ret)
892 goto error;
893 switch (val) {
894 case 0:
895 af9015_af9013_config[i].adc_clock = 28800;
896 break;
897 case 1:
898 af9015_af9013_config[i].adc_clock = 20480;
899 break;
900 case 2:
901 af9015_af9013_config[i].adc_clock = 28000;
902 break;
903 case 3:
904 af9015_af9013_config[i].adc_clock = 25000;
905 break;
906 };
907 deb_info("%s: [%d] xtal:%d set adc_clock:%d\n", __func__, i,
908 val, af9015_af9013_config[i].adc_clock);
909
910 /* tuner IF */
911 req.addr = AF9015_EEPROM_IF1H + offset;
912 ret = af9015_rw_udev(udev, &req);
913 if (ret)
914 goto error;
915 af9015_af9013_config[i].tuner_if = val << 8;
916 req.addr = AF9015_EEPROM_IF1L + offset;
917 ret = af9015_rw_udev(udev, &req);
918 if (ret)
919 goto error;
920 af9015_af9013_config[i].tuner_if += val;
921 deb_info("%s: [%d] IF1:%d\n", __func__, i,
922 af9015_af9013_config[0].tuner_if);
923
924 /* MT2060 IF1 */
925 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
926 ret = af9015_rw_udev(udev, &req);
927 if (ret)
928 goto error;
929 af9015_config.mt2060_if1[i] = val << 8;
930 req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
931 ret = af9015_rw_udev(udev, &req);
932 if (ret)
933 goto error;
934 af9015_config.mt2060_if1[i] += val;
935 deb_info("%s: [%d] MT2060 IF1:%d\n", __func__, i,
936 af9015_config.mt2060_if1[i]);
937
938 /* tuner */
939 req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
940 ret = af9015_rw_udev(udev, &req);
941 if (ret)
942 goto error;
943 switch (val) {
944 case AF9013_TUNER_ENV77H11D5:
945 case AF9013_TUNER_MT2060:
Antti Palosaari80619de2008-09-15 17:18:09 -0300946 case AF9013_TUNER_QT1010:
947 case AF9013_TUNER_UNKNOWN:
948 case AF9013_TUNER_MT2060_2:
949 case AF9013_TUNER_TDA18271:
950 case AF9013_TUNER_QT1010A:
Antti Palosaariee3d4402010-08-13 03:51:26 -0300951 case AF9013_TUNER_TDA18218:
Antti Palosaari80619de2008-09-15 17:18:09 -0300952 af9015_af9013_config[i].rf_spec_inv = 1;
953 break;
954 case AF9013_TUNER_MXL5003D:
955 case AF9013_TUNER_MXL5005D:
956 case AF9013_TUNER_MXL5005R:
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300957 case AF9013_TUNER_MXL5007T:
Antti Palosaari80619de2008-09-15 17:18:09 -0300958 af9015_af9013_config[i].rf_spec_inv = 0;
959 break;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300960 case AF9013_TUNER_MC44S803:
961 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
962 af9015_af9013_config[i].rf_spec_inv = 1;
963 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300964 default:
965 warn("tuner id:%d not supported, please report!", val);
966 return -ENODEV;
967 };
968
969 af9015_af9013_config[i].tuner = val;
970 deb_info("%s: [%d] tuner id:%d\n", __func__, i, val);
971 }
972
973error:
974 if (ret)
975 err("eeprom read failed:%d", ret);
976
Antti Palosaari3956fef2009-03-31 17:01:02 -0300977 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -0300978 content :-( Override some wrong values here. Ditto for the
979 AVerTV Red HD+ (A850T) device. */
Antti Palosaari3956fef2009-03-31 17:01:02 -0300980 if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
Antti Palosaari9a3ecc72010-10-07 21:37:06 -0300981 ((le16_to_cpu(udev->descriptor.idProduct) ==
982 USB_PID_AVERMEDIA_A850) ||
983 (le16_to_cpu(udev->descriptor.idProduct) ==
984 USB_PID_AVERMEDIA_A850T))) {
Antti Palosaari3956fef2009-03-31 17:01:02 -0300985 deb_info("%s: AverMedia A850: overriding config\n", __func__);
986 /* disable dual mode */
987 af9015_config.dual_mode = 0;
988 /* disable 2nd adapter */
989 for (i = 0; i < af9015_properties_count; i++)
990 af9015_properties[i].num_adapters = 1;
991
992 /* set correct IF */
993 af9015_af9013_config[0].tuner_if = 4570;
994 }
995
Antti Palosaari80619de2008-09-15 17:18:09 -0300996 return ret;
997}
998
999static int af9015_identify_state(struct usb_device *udev,
1000 struct dvb_usb_device_properties *props,
1001 struct dvb_usb_device_description **desc,
1002 int *cold)
1003{
1004 int ret;
1005 u8 reply;
1006 struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
1007
1008 ret = af9015_rw_udev(udev, &req);
1009 if (ret)
1010 return ret;
1011
1012 deb_info("%s: reply:%02x\n", __func__, reply);
1013 if (reply == 0x02)
1014 *cold = 0;
1015 else
1016 *cold = 1;
1017
1018 return ret;
1019}
1020
Antti Palosaari1cd72782010-10-12 17:22:32 -03001021static int af9015_rc_query(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -03001022{
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001023 struct af9015_state *priv = d->priv;
1024 int ret;
Ian Armstrongc1e13972011-03-18 19:23:05 -03001025 u8 buf[17];
Antti Palosaari80619de2008-09-15 17:18:09 -03001026
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001027 /* read registers needed to detect remote controller code */
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001028 ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
Antti Palosaari80619de2008-09-15 17:18:09 -03001029 if (ret)
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001030 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -03001031
Ian Armstrongc1e13972011-03-18 19:23:05 -03001032 /* If any of these are non-zero, assume invalid data */
1033 if (buf[1] || buf[2] || buf[3])
1034 return ret;
1035
1036 /* Check for repeat of previous code */
1037 if ((priv->rc_repeat != buf[6] || buf[0]) &&
1038 !memcmp(&buf[12], priv->rc_last, 4)) {
1039 deb_rc("%s: key repeated\n", __func__);
1040 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1041 priv->rc_repeat = buf[6];
1042 return ret;
1043 }
1044
1045 /* Only process key if canary killed */
1046 if (buf[16] != 0xff && buf[0] != 0x01) {
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001047 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
1048 buf[12], buf[13], buf[14], buf[15]);
Antti Palosaari80619de2008-09-15 17:18:09 -03001049
Antti Palosaari1e8750c2011-03-18 19:36:42 -03001050 /* Reset the canary */
1051 ret = af9015_write_reg(d, 0x98e9, 0xff);
1052 if (ret)
1053 goto error;
1054
Ian Armstrongc1e13972011-03-18 19:23:05 -03001055 /* Remember this key */
1056 memcpy(priv->rc_last, &buf[12], 4);
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001057 if (buf[14] == (u8) ~buf[15]) {
1058 if (buf[12] == (u8) ~buf[13]) {
Antti Palosaari1cd72782010-10-12 17:22:32 -03001059 /* NEC */
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001060 priv->rc_keycode = buf[12] << 8 | buf[14];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001061 } else {
1062 /* NEC extended*/
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001063 priv->rc_keycode = buf[12] << 16 |
1064 buf[13] << 8 | buf[14];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001065 }
Antti Palosaari1cd72782010-10-12 17:22:32 -03001066 } else {
Antti Palosaari1e8750c2011-03-18 19:36:42 -03001067 /* 32 bit NEC */
Ian Armstrongc1e13972011-03-18 19:23:05 -03001068 priv->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1069 buf[14] << 8 | buf[15];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001070 }
Mauro Carvalho Chehabca866742010-11-17 13:53:11 -03001071 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001072 } else {
1073 deb_rc("%s: no key press\n", __func__);
Ian Armstrongc1e13972011-03-18 19:23:05 -03001074 /* Invalidate last keypress */
1075 /* Not really needed, but helps with debug */
1076 priv->rc_last[2] = priv->rc_last[3];
Antti Palosaari80619de2008-09-15 17:18:09 -03001077 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001078
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001079 priv->rc_repeat = buf[6];
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001080
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001081error:
1082 if (ret)
1083 err("%s: failed:%d", __func__, ret);
1084
1085 return ret;
Antti Palosaari80619de2008-09-15 17:18:09 -03001086}
1087
1088/* init 2nd I2C adapter */
Antti Palosaari349d0422008-11-05 16:31:24 -03001089static int af9015_i2c_init(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -03001090{
1091 int ret;
1092 struct af9015_state *state = d->priv;
1093 deb_info("%s:\n", __func__);
1094
1095 strncpy(state->i2c_adap.name, d->desc->name,
1096 sizeof(state->i2c_adap.name));
Antti Palosaari80619de2008-09-15 17:18:09 -03001097 state->i2c_adap.algo = d->props.i2c_algo;
1098 state->i2c_adap.algo_data = NULL;
1099 state->i2c_adap.dev.parent = &d->udev->dev;
1100
1101 i2c_set_adapdata(&state->i2c_adap, d);
1102
1103 ret = i2c_add_adapter(&state->i2c_adap);
1104 if (ret < 0)
1105 err("could not add i2c adapter");
1106
1107 return ret;
1108}
1109
1110static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1111{
1112 int ret;
1113 struct af9015_state *state = adap->dev->priv;
1114 struct i2c_adapter *i2c_adap;
1115
1116 if (adap->id == 0) {
1117 /* select I2C adapter */
1118 i2c_adap = &adap->dev->i2c_adap;
1119
1120 deb_info("%s: init I2C\n", __func__);
1121 ret = af9015_i2c_init(adap->dev);
Antti Palosaari80619de2008-09-15 17:18:09 -03001122 } else {
1123 /* select I2C adapter */
1124 i2c_adap = &state->i2c_adap;
1125
1126 /* copy firmware to 2nd demodulator */
1127 if (af9015_config.dual_mode) {
1128 ret = af9015_copy_firmware(adap->dev);
1129 if (ret) {
1130 err("firmware copy to 2nd frontend " \
1131 "failed, will disable it");
1132 af9015_config.dual_mode = 0;
1133 return -ENODEV;
1134 }
1135 } else {
1136 return -ENODEV;
1137 }
1138 }
1139
1140 /* attach demodulator */
1141 adap->fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
1142 i2c_adap);
1143
1144 return adap->fe == NULL ? -ENODEV : 0;
1145}
1146
1147static struct mt2060_config af9015_mt2060_config = {
1148 .i2c_address = 0xc0,
1149 .clock_out = 0,
1150};
1151
1152static struct qt1010_config af9015_qt1010_config = {
1153 .i2c_address = 0xc4,
1154};
1155
1156static struct tda18271_config af9015_tda18271_config = {
1157 .gate = TDA18271_GATE_DIGITAL,
Mauro Carvalho Chehab7655e592010-10-27 14:55:34 -02001158 .small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
Antti Palosaari80619de2008-09-15 17:18:09 -03001159};
1160
1161static struct mxl5005s_config af9015_mxl5003_config = {
1162 .i2c_address = 0xc6,
1163 .if_freq = IF_FREQ_4570000HZ,
1164 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1165 .agc_mode = MXL_SINGLE_AGC,
1166 .tracking_filter = MXL_TF_DEFAULT,
Antti Palosaaria1310772008-09-22 13:59:25 -03001167 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -03001168 .cap_select = MXL_CAP_SEL_ENABLE,
1169 .div_out = MXL_DIV_OUT_4,
1170 .clock_out = MXL_CLOCK_OUT_DISABLE,
1171 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1172 .top = MXL5005S_TOP_25P2,
1173 .mod_mode = MXL_DIGITAL_MODE,
1174 .if_mode = MXL_ZERO_IF,
1175 .AgcMasterByte = 0x00,
1176};
1177
1178static struct mxl5005s_config af9015_mxl5005_config = {
1179 .i2c_address = 0xc6,
1180 .if_freq = IF_FREQ_4570000HZ,
1181 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1182 .agc_mode = MXL_SINGLE_AGC,
1183 .tracking_filter = MXL_TF_OFF,
Antti Palosaaria1310772008-09-22 13:59:25 -03001184 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -03001185 .cap_select = MXL_CAP_SEL_ENABLE,
1186 .div_out = MXL_DIV_OUT_4,
1187 .clock_out = MXL_CLOCK_OUT_DISABLE,
1188 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1189 .top = MXL5005S_TOP_25P2,
1190 .mod_mode = MXL_DIGITAL_MODE,
1191 .if_mode = MXL_ZERO_IF,
1192 .AgcMasterByte = 0x00,
1193};
1194
Jochen Friedrichd5633992009-02-02 14:59:50 -03001195static struct mc44s803_config af9015_mc44s803_config = {
1196 .i2c_address = 0xc0,
1197 .dig_out = 1,
1198};
1199
Antti Palosaariee3d4402010-08-13 03:51:26 -03001200static struct tda18218_config af9015_tda18218_config = {
1201 .i2c_address = 0xc0,
1202 .i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
1203};
1204
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001205static struct mxl5007t_config af9015_mxl5007t_config = {
1206 .xtal_freq_hz = MxL_XTAL_24_MHZ,
1207 .if_freq_hz = MxL_IF_4_57_MHZ,
1208};
1209
Antti Palosaari80619de2008-09-15 17:18:09 -03001210static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
1211{
1212 struct af9015_state *state = adap->dev->priv;
1213 struct i2c_adapter *i2c_adap;
1214 int ret;
Antti Palosaari9a3ecc72010-10-07 21:37:06 -03001215 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001216
1217 /* select I2C adapter */
1218 if (adap->id == 0)
1219 i2c_adap = &adap->dev->i2c_adap;
1220 else
1221 i2c_adap = &state->i2c_adap;
1222
1223 switch (af9015_af9013_config[adap->id].tuner) {
1224 case AF9013_TUNER_MT2060:
1225 case AF9013_TUNER_MT2060_2:
1226 ret = dvb_attach(mt2060_attach, adap->fe, i2c_adap,
1227 &af9015_mt2060_config,
1228 af9015_config.mt2060_if1[adap->id])
1229 == NULL ? -ENODEV : 0;
1230 break;
1231 case AF9013_TUNER_QT1010:
1232 case AF9013_TUNER_QT1010A:
1233 ret = dvb_attach(qt1010_attach, adap->fe, i2c_adap,
1234 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
1235 break;
1236 case AF9013_TUNER_TDA18271:
1237 ret = dvb_attach(tda18271_attach, adap->fe, 0xc0, i2c_adap,
1238 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
1239 break;
Antti Palosaariee3d4402010-08-13 03:51:26 -03001240 case AF9013_TUNER_TDA18218:
1241 ret = dvb_attach(tda18218_attach, adap->fe, i2c_adap,
1242 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
1243 break;
Antti Palosaari80619de2008-09-15 17:18:09 -03001244 case AF9013_TUNER_MXL5003D:
1245 ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1246 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
1247 break;
1248 case AF9013_TUNER_MXL5005D:
1249 case AF9013_TUNER_MXL5005R:
1250 ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1251 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
1252 break;
1253 case AF9013_TUNER_ENV77H11D5:
1254 ret = dvb_attach(dvb_pll_attach, adap->fe, 0xc0, i2c_adap,
1255 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
1256 break;
1257 case AF9013_TUNER_MC44S803:
Jochen Friedrichd5633992009-02-02 14:59:50 -03001258 ret = dvb_attach(mc44s803_attach, adap->fe, i2c_adap,
1259 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -03001260 break;
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001261 case AF9013_TUNER_MXL5007T:
1262 ret = dvb_attach(mxl5007t_attach, adap->fe, i2c_adap,
1263 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
1264 break;
Antti Palosaari80619de2008-09-15 17:18:09 -03001265 case AF9013_TUNER_UNKNOWN:
1266 default:
1267 ret = -ENODEV;
1268 err("Unknown tuner id:%d",
1269 af9015_af9013_config[adap->id].tuner);
1270 }
1271 return ret;
1272}
1273
1274static struct usb_device_id af9015_usb_table[] = {
1275/* 0 */{USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015)},
1276 {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016)},
1277 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD)},
1278 {USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E)},
1279 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U)},
1280/* 5 */{USB_DEVICE(USB_VID_VISIONPLUS,
1281 USB_PID_TINYTWIN)},
1282 {USB_DEVICE(USB_VID_VISIONPLUS,
1283 USB_PID_AZUREWAVE_AD_TU700)},
1284 {USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2)},
1285 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T)},
1286 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X)},
1287/* 10 */{USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380)},
1288 {USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO)},
1289 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2)},
Antti Palosaaria3765882008-09-19 18:34:06 -03001290 {USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2)},
Antti Palosaari05c1cab2008-09-22 12:32:37 -03001291 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309)},
Herbert Graeber641015a2008-10-07 10:06:36 -03001292/* 15 */{USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III)},
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001293 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U)},
Antti Palosaari71bf2e02009-01-13 12:47:28 -03001294 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)},
Antti Palosaari58fe1592009-03-26 20:41:05 -03001295 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)},
Marc Schneider26144842009-03-26 21:07:18 -03001296 {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)},
Antti Palosaari1ed5fad2009-04-09 15:14:18 -03001297/* 20 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)},
1298 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)},
Marcel Jueling734dd232009-04-09 17:16:41 -03001299 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)},
Wen-chien Jesse Sung6e9c1a22009-04-28 01:11:22 -03001300 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
Antti Palosaari22d46452009-05-31 17:07:01 -03001301 {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
Mart Raudseppc92f0562009-07-24 13:45:41 -03001302/* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
Antti Palosaari486ba122009-09-18 13:37:57 -03001303 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)},
Ignacio de Miguel Diaz52322632009-11-13 23:13:34 -03001304 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)},
Antti Palosaarifa1df552010-02-10 20:05:48 -03001305 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2)},
Antti Palosaari809c1e82010-02-10 20:07:30 -03001306 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS)},
Antti Palosaariab9b4f22010-03-01 13:50:40 -03001307/* 30 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T)},
Antti Palosaari7fc87092010-03-01 14:06:52 -03001308 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4)},
Antti Palosaari2606cfa2010-05-23 18:26:37 -03001309 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M)},
Stefan Lippers-Hollmannd7ef4852010-08-25 10:08:48 -03001310 {USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_RC)},
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001311 {USB_DEVICE(USB_VID_TERRATEC,
1312 USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC)},
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001313/* 35 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T)},
Antti Palosaarif8c61272010-10-23 07:35:31 -03001314 {USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3)},
Antti Palosaari80619de2008-09-15 17:18:09 -03001315 {0},
1316};
1317MODULE_DEVICE_TABLE(usb, af9015_usb_table);
1318
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001319#define AF9015_RC_INTERVAL 500
Antti Palosaari80619de2008-09-15 17:18:09 -03001320static struct dvb_usb_device_properties af9015_properties[] = {
1321 {
1322 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1323
1324 .usb_ctrl = DEVICE_SPECIFIC,
1325 .download_firmware = af9015_download_firmware,
1326 .firmware = "dvb-usb-af9015.fw",
Jose Alberto Reguerocce25712008-11-13 14:14:18 -03001327 .no_reconnect = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001328
Antti Palosaari02542942009-09-16 20:33:03 -03001329 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari80619de2008-09-15 17:18:09 -03001330
1331 .num_adapters = 2,
1332 .adapter = {
1333 {
1334 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1335 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1336
1337 .pid_filter_count = 32,
1338 .pid_filter = af9015_pid_filter,
1339 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1340
1341 .frontend_attach =
1342 af9015_af9013_frontend_attach,
1343 .tuner_attach = af9015_tuner_attach,
1344 .stream = {
1345 .type = USB_BULK,
1346 .count = 6,
1347 .endpoint = 0x84,
1348 },
1349 },
1350 {
1351 .frontend_attach =
1352 af9015_af9013_frontend_attach,
1353 .tuner_attach = af9015_tuner_attach,
1354 .stream = {
1355 .type = USB_BULK,
1356 .count = 6,
1357 .endpoint = 0x85,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001358 .u = {
1359 .bulk = {
1360 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001361 TS_USB20_FRAME_SIZE,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001362 }
1363 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001364 },
1365 }
1366 },
1367
1368 .identify_state = af9015_identify_state,
1369
Antti Palosaari1cd72782010-10-12 17:22:32 -03001370 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001371 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001372 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001373 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001374 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001375 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001376 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001377
1378 .i2c_algo = &af9015_i2c_algo,
1379
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001380 .num_device_descs = 12, /* check max from dvb-usb.h */
Antti Palosaari80619de2008-09-15 17:18:09 -03001381 .devices = {
1382 {
1383 .name = "Afatech AF9015 DVB-T USB2.0 stick",
1384 .cold_ids = {&af9015_usb_table[0],
1385 &af9015_usb_table[1], NULL},
1386 .warm_ids = {NULL},
1387 },
1388 {
1389 .name = "Leadtek WinFast DTV Dongle Gold",
1390 .cold_ids = {&af9015_usb_table[2], NULL},
1391 .warm_ids = {NULL},
1392 },
1393 {
1394 .name = "Pinnacle PCTV 71e",
1395 .cold_ids = {&af9015_usb_table[3], NULL},
1396 .warm_ids = {NULL},
1397 },
1398 {
1399 .name = "KWorld PlusTV Dual DVB-T Stick " \
1400 "(DVB-T 399U)",
Mart Raudseppc92f0562009-07-24 13:45:41 -03001401 .cold_ids = {&af9015_usb_table[4],
1402 &af9015_usb_table[25], NULL},
Antti Palosaari80619de2008-09-15 17:18:09 -03001403 .warm_ids = {NULL},
1404 },
1405 {
1406 .name = "DigitalNow TinyTwin DVB-T Receiver",
Antti Palosaarifa1df552010-02-10 20:05:48 -03001407 .cold_ids = {&af9015_usb_table[5],
Antti Palosaarif8c61272010-10-23 07:35:31 -03001408 &af9015_usb_table[28],
1409 &af9015_usb_table[36], NULL},
Antti Palosaari80619de2008-09-15 17:18:09 -03001410 .warm_ids = {NULL},
1411 },
1412 {
1413 .name = "TwinHan AzureWave AD-TU700(704J)",
1414 .cold_ids = {&af9015_usb_table[6], NULL},
1415 .warm_ids = {NULL},
1416 },
1417 {
1418 .name = "TerraTec Cinergy T USB XE",
1419 .cold_ids = {&af9015_usb_table[7], NULL},
1420 .warm_ids = {NULL},
1421 },
1422 {
1423 .name = "KWorld PlusTV Dual DVB-T PCI " \
1424 "(DVB-T PC160-2T)",
1425 .cold_ids = {&af9015_usb_table[8], NULL},
1426 .warm_ids = {NULL},
1427 },
1428 {
1429 .name = "AVerMedia AVerTV DVB-T Volar X",
1430 .cold_ids = {&af9015_usb_table[9], NULL},
1431 .warm_ids = {NULL},
1432 },
Antti Palosaari76391a72010-09-09 12:10:50 -03001433 {
1434 .name = "TerraTec Cinergy T Stick RC",
1435 .cold_ids = {&af9015_usb_table[33], NULL},
1436 .warm_ids = {NULL},
1437 },
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001438 {
1439 .name = "TerraTec Cinergy T Stick Dual RC",
1440 .cold_ids = {&af9015_usb_table[34], NULL},
1441 .warm_ids = {NULL},
1442 },
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001443 {
1444 .name = "AverMedia AVerTV Red HD+ (A850T)",
1445 .cold_ids = {&af9015_usb_table[35], NULL},
1446 .warm_ids = {NULL},
1447 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001448 }
1449 }, {
1450 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1451
1452 .usb_ctrl = DEVICE_SPECIFIC,
1453 .download_firmware = af9015_download_firmware,
1454 .firmware = "dvb-usb-af9015.fw",
Jose Alberto Reguerocce25712008-11-13 14:14:18 -03001455 .no_reconnect = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001456
Antti Palosaari02542942009-09-16 20:33:03 -03001457 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari80619de2008-09-15 17:18:09 -03001458
1459 .num_adapters = 2,
1460 .adapter = {
1461 {
1462 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1463 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1464
1465 .pid_filter_count = 32,
1466 .pid_filter = af9015_pid_filter,
1467 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1468
1469 .frontend_attach =
1470 af9015_af9013_frontend_attach,
1471 .tuner_attach = af9015_tuner_attach,
1472 .stream = {
1473 .type = USB_BULK,
1474 .count = 6,
1475 .endpoint = 0x84,
1476 },
1477 },
1478 {
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 = 0x85,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001486 .u = {
1487 .bulk = {
1488 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001489 TS_USB20_FRAME_SIZE,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001490 }
1491 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001492 },
1493 }
1494 },
1495
1496 .identify_state = af9015_identify_state,
1497
Antti Palosaari1cd72782010-10-12 17:22:32 -03001498 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001499 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001500 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001501 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001502 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001503 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001504 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001505
1506 .i2c_algo = &af9015_i2c_algo,
1507
Antti Palosaaria44b91d2010-09-09 12:05:31 -03001508 .num_device_descs = 9, /* check max from dvb-usb.h */
Antti Palosaari80619de2008-09-15 17:18:09 -03001509 .devices = {
1510 {
1511 .name = "Xtensions XD-380",
1512 .cold_ids = {&af9015_usb_table[10], NULL},
1513 .warm_ids = {NULL},
1514 },
1515 {
1516 .name = "MSI DIGIVOX Duo",
1517 .cold_ids = {&af9015_usb_table[11], NULL},
1518 .warm_ids = {NULL},
1519 },
1520 {
1521 .name = "Fujitsu-Siemens Slim Mobile USB DVB-T",
1522 .cold_ids = {&af9015_usb_table[12], NULL},
1523 .warm_ids = {NULL},
1524 },
Mikko Ohtamaa111f9ec2008-09-19 18:26:05 -03001525 {
Antti Palosaaria3765882008-09-19 18:34:06 -03001526 .name = "Telestar Starstick 2",
Mikko Ohtamaa111f9ec2008-09-19 18:26:05 -03001527 .cold_ids = {&af9015_usb_table[13], NULL},
1528 .warm_ids = {NULL},
1529 },
Antti Palosaari05c1cab2008-09-22 12:32:37 -03001530 {
1531 .name = "AVerMedia A309",
1532 .cold_ids = {&af9015_usb_table[14], NULL},
1533 .warm_ids = {NULL},
1534 },
Herbert Graeber641015a2008-10-07 10:06:36 -03001535 {
1536 .name = "MSI Digi VOX mini III",
1537 .cold_ids = {&af9015_usb_table[15], NULL},
1538 .warm_ids = {NULL},
1539 },
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001540 {
1541 .name = "KWorld USB DVB-T TV Stick II " \
1542 "(VS-DVB-T 395U)",
Antti Palosaari71bf2e02009-01-13 12:47:28 -03001543 .cold_ids = {&af9015_usb_table[16],
Antti Palosaari58fe1592009-03-26 20:41:05 -03001544 &af9015_usb_table[17],
Antti Palosaari7fc87092010-03-01 14:06:52 -03001545 &af9015_usb_table[18],
1546 &af9015_usb_table[31], NULL},
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001547 .warm_ids = {NULL},
1548 },
Marc Schneider26144842009-03-26 21:07:18 -03001549 {
1550 .name = "TrekStor DVB-T USB Stick",
1551 .cold_ids = {&af9015_usb_table[19], NULL},
1552 .warm_ids = {NULL},
1553 },
Antti Palosaari3956fef2009-03-31 17:01:02 -03001554 {
1555 .name = "AverMedia AVerTV Volar Black HD " \
1556 "(A850)",
1557 .cold_ids = {&af9015_usb_table[20], NULL},
1558 .warm_ids = {NULL},
1559 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001560 }
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001561 }, {
1562 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1563
1564 .usb_ctrl = DEVICE_SPECIFIC,
1565 .download_firmware = af9015_download_firmware,
1566 .firmware = "dvb-usb-af9015.fw",
1567 .no_reconnect = 1,
1568
Antti Palosaari02542942009-09-16 20:33:03 -03001569 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001570
1571 .num_adapters = 2,
1572 .adapter = {
1573 {
1574 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1575 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1576
1577 .pid_filter_count = 32,
1578 .pid_filter = af9015_pid_filter,
1579 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1580
1581 .frontend_attach =
1582 af9015_af9013_frontend_attach,
1583 .tuner_attach = af9015_tuner_attach,
1584 .stream = {
1585 .type = USB_BULK,
1586 .count = 6,
1587 .endpoint = 0x84,
1588 },
1589 },
1590 {
1591 .frontend_attach =
1592 af9015_af9013_frontend_attach,
1593 .tuner_attach = af9015_tuner_attach,
1594 .stream = {
1595 .type = USB_BULK,
1596 .count = 6,
1597 .endpoint = 0x85,
1598 .u = {
1599 .bulk = {
1600 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001601 TS_USB20_FRAME_SIZE,
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001602 }
1603 }
1604 },
1605 }
1606 },
1607
1608 .identify_state = af9015_identify_state,
1609
Antti Palosaari1cd72782010-10-12 17:22:32 -03001610 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001611 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001612 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001613 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001614 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001615 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001616 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001617
1618 .i2c_algo = &af9015_i2c_algo,
1619
Antti Palosaaria44b91d2010-09-09 12:05:31 -03001620 .num_device_descs = 9, /* check max from dvb-usb.h */
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001621 .devices = {
Antti Palosaari1ed5fad2009-04-09 15:14:18 -03001622 {
1623 .name = "AverMedia AVerTV Volar GPS 805 (A805)",
1624 .cold_ids = {&af9015_usb_table[21], NULL},
1625 .warm_ids = {NULL},
1626 },
Marcel Jueling734dd232009-04-09 17:16:41 -03001627 {
1628 .name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1629 "V3.0",
1630 .cold_ids = {&af9015_usb_table[22], NULL},
1631 .warm_ids = {NULL},
1632 },
Wen-chien Jesse Sung6e9c1a22009-04-28 01:11:22 -03001633 {
1634 .name = "KWorld Digial MC-810",
1635 .cold_ids = {&af9015_usb_table[23], NULL},
1636 .warm_ids = {NULL},
1637 },
Antti Palosaari22d46452009-05-31 17:07:01 -03001638 {
1639 .name = "Genius TVGo DVB-T03",
1640 .cold_ids = {&af9015_usb_table[24], NULL},
1641 .warm_ids = {NULL},
1642 },
Antti Palosaari486ba122009-09-18 13:37:57 -03001643 {
1644 .name = "KWorld PlusTV DVB-T PCI Pro Card " \
1645 "(DVB-T PC160-T)",
1646 .cold_ids = {&af9015_usb_table[26], NULL},
1647 .warm_ids = {NULL},
1648 },
Ignacio de Miguel Diaz52322632009-11-13 23:13:34 -03001649 {
1650 .name = "Sveon STV20 Tuner USB DVB-T HDTV",
1651 .cold_ids = {&af9015_usb_table[27], NULL},
1652 .warm_ids = {NULL},
1653 },
Antti Palosaari809c1e82010-02-10 20:07:30 -03001654 {
1655 .name = "Leadtek WinFast DTV2000DS",
1656 .cold_ids = {&af9015_usb_table[29], NULL},
1657 .warm_ids = {NULL},
1658 },
Antti Palosaariab9b4f22010-03-01 13:50:40 -03001659 {
1660 .name = "KWorld USB DVB-T Stick Mobile " \
1661 "(UB383-T)",
1662 .cold_ids = {&af9015_usb_table[30], NULL},
1663 .warm_ids = {NULL},
1664 },
Antti Palosaari2606cfa2010-05-23 18:26:37 -03001665 {
1666 .name = "AverMedia AVerTV Volar M (A815Mac)",
1667 .cold_ids = {&af9015_usb_table[32], NULL},
1668 .warm_ids = {NULL},
1669 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001670 }
1671 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001672};
Antti Palosaari80619de2008-09-15 17:18:09 -03001673
1674static int af9015_usb_probe(struct usb_interface *intf,
1675 const struct usb_device_id *id)
1676{
1677 int ret = 0;
1678 struct dvb_usb_device *d = NULL;
1679 struct usb_device *udev = interface_to_usbdev(intf);
1680 u8 i;
1681
1682 deb_info("%s: interface:%d\n", __func__,
1683 intf->cur_altsetting->desc.bInterfaceNumber);
1684
1685 /* interface 0 is used by DVB-T receiver and
1686 interface 1 is for remote controller (HID) */
1687 if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
1688 ret = af9015_read_config(udev);
1689 if (ret)
1690 return ret;
1691
1692 for (i = 0; i < af9015_properties_count; i++) {
1693 ret = dvb_usb_device_init(intf, &af9015_properties[i],
1694 THIS_MODULE, &d, adapter_nr);
1695 if (!ret)
1696 break;
1697 if (ret != -ENODEV)
1698 return ret;
1699 }
1700 if (ret)
1701 return ret;
1702
1703 if (d)
1704 ret = af9015_init(d);
1705 }
1706
1707 return ret;
1708}
1709
Antti Palosaari349d0422008-11-05 16:31:24 -03001710static void af9015_i2c_exit(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -03001711{
1712 struct af9015_state *state = d->priv;
Antti Palosaari9a3ecc72010-10-07 21:37:06 -03001713 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001714
1715 /* remove 2nd I2C adapter */
1716 if (d->state & DVB_USB_STATE_I2C)
1717 i2c_del_adapter(&state->i2c_adap);
1718}
1719
1720static void af9015_usb_device_exit(struct usb_interface *intf)
1721{
1722 struct dvb_usb_device *d = usb_get_intfdata(intf);
Antti Palosaari9a3ecc72010-10-07 21:37:06 -03001723 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001724
1725 /* remove 2nd I2C adapter */
1726 if (d != NULL && d->desc != NULL)
1727 af9015_i2c_exit(d);
1728
1729 dvb_usb_device_exit(intf);
1730}
1731
1732/* usb specific object needed to register this driver with the usb subsystem */
1733static struct usb_driver af9015_usb_driver = {
1734 .name = "dvb_usb_af9015",
1735 .probe = af9015_usb_probe,
1736 .disconnect = af9015_usb_device_exit,
1737 .id_table = af9015_usb_table,
1738};
1739
1740/* module stuff */
1741static int __init af9015_usb_module_init(void)
1742{
1743 int ret;
1744 ret = usb_register(&af9015_usb_driver);
1745 if (ret)
1746 err("module init failed:%d", ret);
1747
1748 return ret;
1749}
1750
1751static void __exit af9015_usb_module_exit(void)
1752{
1753 /* deregister this driver from the USB subsystem */
1754 usb_deregister(&af9015_usb_driver);
1755}
1756
1757module_init(af9015_usb_module_init);
1758module_exit(af9015_usb_module_exit);
1759
1760MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1761MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1762MODULE_LICENSE("GPL");