blob: e755d7637c2210da530543a31a44e35913fa4cdf [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 {
Antti Palosaarif571e002011-11-28 20:58:11 -030053 .i2c_addr = AF9015_I2C_DEMOD,
54 .ts_mode = AF9013_TS_USB,
Antti Palosaari80619de2008-09-15 17:18:09 -030055 .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 }, {
Antti Palosaarif571e002011-11-28 20:58:11 -030060 .ts_mode = AF9013_TS_SERIAL,
Antti Palosaari80619de2008-09-15 17:18:09 -030061 .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:
Antti Palosaari80619de2008-09-15 17:18:09 -030094 write = 0;
95 break;
96 case READ_I2C:
97 write = 0;
98 buf[2] |= 0x01; /* set I2C direction */
99 case WRITE_I2C:
100 buf[0] = READ_WRITE_I2C;
101 break;
102 case WRITE_MEMORY:
103 if (((req->addr & 0xff00) == 0xff00) ||
Antti Palosaarif4e96de2009-09-12 21:25:59 -0300104 ((req->addr & 0xff00) == 0xae00))
Antti Palosaari80619de2008-09-15 17:18:09 -0300105 buf[0] = WRITE_VIRTUAL_MEMORY;
106 case WRITE_VIRTUAL_MEMORY:
107 case COPY_FIRMWARE:
108 case DOWNLOAD_FIRMWARE:
Nils Kassubeba1bc642009-07-28 11:54:52 -0300109 case BOOT:
Antti Palosaari80619de2008-09-15 17:18:09 -0300110 break;
111 default:
112 err("unknown command:%d", req->cmd);
113 ret = -1;
114 goto error_unlock;
115 }
116
Antti Palosaari06565d72009-09-12 20:46:30 -0300117 /* buffer overflow check */
118 if ((write && (req->data_len > BUF_LEN - REQ_HDR_LEN)) ||
119 (!write && (req->data_len > BUF_LEN - ACK_HDR_LEN))) {
120 err("too much data; cmd:%d len:%d", req->cmd, req->data_len);
121 ret = -EINVAL;
122 goto error_unlock;
123 }
124
Antti Palosaari80619de2008-09-15 17:18:09 -0300125 /* write requested */
126 if (write) {
Antti Palosaari06565d72009-09-12 20:46:30 -0300127 memcpy(&buf[REQ_HDR_LEN], req->data, req->data_len);
Antti Palosaari80619de2008-09-15 17:18:09 -0300128 msg_len += req->data_len;
129 }
Antti Palosaari06565d72009-09-12 20:46:30 -0300130
Antti Palosaari80619de2008-09-15 17:18:09 -0300131 deb_xfer(">>> ");
132 debug_dump(buf, msg_len, deb_xfer);
133
134 /* send req */
135 ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x02), buf, msg_len,
Antti Palosaari06565d72009-09-12 20:46:30 -0300136 &act_len, AF9015_USB_TIMEOUT);
Antti Palosaari80619de2008-09-15 17:18:09 -0300137 if (ret)
138 err("bulk message failed:%d (%d/%d)", ret, msg_len, act_len);
139 else
140 if (act_len != msg_len)
141 ret = -1; /* all data is not send */
142 if (ret)
143 goto error_unlock;
144
145 /* no ack for those packets */
146 if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB)
147 goto exit_unlock;
148
Antti Palosaari06565d72009-09-12 20:46:30 -0300149 /* write receives seq + status = 2 bytes
150 read receives seq + status + data = 2 + N bytes */
151 msg_len = ACK_HDR_LEN;
152 if (!write)
153 msg_len += req->data_len;
154
Antti Palosaari80619de2008-09-15 17:18:09 -0300155 ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, 0x81), buf, msg_len,
Antti Palosaari06565d72009-09-12 20:46:30 -0300156 &act_len, AF9015_USB_TIMEOUT);
Antti Palosaari80619de2008-09-15 17:18:09 -0300157 if (ret) {
158 err("recv bulk message failed:%d", ret);
159 ret = -1;
160 goto error_unlock;
161 }
162
163 deb_xfer("<<< ");
164 debug_dump(buf, act_len, deb_xfer);
165
Antti Palosaari80619de2008-09-15 17:18:09 -0300166 /* check status */
167 if (buf[1]) {
168 err("command failed:%d", buf[1]);
169 ret = -1;
170 goto error_unlock;
171 }
172
173 /* read request, copy returned data to return buf */
174 if (!write)
Antti Palosaari06565d72009-09-12 20:46:30 -0300175 memcpy(req->data, &buf[ACK_HDR_LEN], req->data_len);
Antti Palosaari80619de2008-09-15 17:18:09 -0300176
177error_unlock:
178exit_unlock:
179 mutex_unlock(&af9015_usb_mutex);
180
181 return ret;
182}
183
184static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req)
185{
186 return af9015_rw_udev(d->udev, req);
187}
188
189static int af9015_write_regs(struct dvb_usb_device *d, u16 addr, u8 *val,
190 u8 len)
191{
192 struct req_t req = {WRITE_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
193 val};
194 return af9015_ctrl_msg(d, &req);
195}
196
197static int af9015_write_reg(struct dvb_usb_device *d, u16 addr, u8 val)
198{
199 return af9015_write_regs(d, addr, &val, 1);
200}
201
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300202static int af9015_read_regs(struct dvb_usb_device *d, u16 addr, u8 *val, u8 len)
203{
204 struct req_t req = {READ_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
205 val};
206 return af9015_ctrl_msg(d, &req);
207}
208
Antti Palosaari80619de2008-09-15 17:18:09 -0300209static int af9015_read_reg(struct dvb_usb_device *d, u16 addr, u8 *val)
210{
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300211 return af9015_read_regs(d, addr, val, 1);
Antti Palosaari80619de2008-09-15 17:18:09 -0300212}
213
214static int af9015_write_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
215 u8 val)
216{
217 struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val};
218
Antti Palosaarif571e002011-11-28 20:58:11 -0300219 if (addr == af9015_af9013_config[0].i2c_addr ||
220 addr == af9015_af9013_config[1].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300221 req.addr_len = 3;
222
223 return af9015_ctrl_msg(d, &req);
224}
225
226static int af9015_read_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
227 u8 *val)
228{
229 struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val};
230
Antti Palosaarif571e002011-11-28 20:58:11 -0300231 if (addr == af9015_af9013_config[0].i2c_addr ||
232 addr == af9015_af9013_config[1].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300233 req.addr_len = 3;
234
235 return af9015_ctrl_msg(d, &req);
236}
237
238static int af9015_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
239 int num)
240{
241 struct dvb_usb_device *d = i2c_get_adapdata(adap);
242 int ret = 0, i = 0;
243 u16 addr;
Antti Palosaari675375d2010-10-07 21:46:41 -0300244 u8 uninitialized_var(mbox), addr_len;
Antti Palosaari80619de2008-09-15 17:18:09 -0300245 struct req_t req;
246
247/* TODO: implement bus lock
248
249The bus lock is needed because there is two tuners both using same I2C-address.
250Due to that the only way to select correct tuner is use demodulator I2C-gate.
251
252................................................
253. AF9015 includes integrated AF9013 demodulator.
254. ____________ ____________ . ____________
255.| uC | | demod | . | tuner |
256.|------------| |------------| . |------------|
257.| AF9015 | | AF9013/5 | . | MXL5003 |
258.| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
259.| | | | addr 0x38 | . | addr 0xc6 |
260.|____________| | |____________| . |____________|
261.................|..............................
262 | ____________ ____________
263 | | demod | | tuner |
264 | |------------| |------------|
265 | | AF9013 | | MXL5003 |
266 +----I2C-------|-----/ -----|-------I2C-------| |
267 | addr 0x3a | | addr 0xc6 |
268 |____________| |____________|
269*/
270 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
271 return -EAGAIN;
272
273 while (i < num) {
Antti Palosaarif571e002011-11-28 20:58:11 -0300274 if (msg[i].addr == af9015_af9013_config[0].i2c_addr ||
275 msg[i].addr == af9015_af9013_config[1].i2c_addr) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300276 addr = msg[i].buf[0] << 8;
277 addr += msg[i].buf[1];
278 mbox = msg[i].buf[2];
279 addr_len = 3;
280 } else {
281 addr = msg[i].buf[0];
282 addr_len = 1;
Antti Palosaari675375d2010-10-07 21:46:41 -0300283 /* mbox is don't care in that case */
Antti Palosaari80619de2008-09-15 17:18:09 -0300284 }
285
286 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
Antti Palosaari709d9202011-06-17 21:16:38 -0300287 if (msg[i].len > 3 || msg[i+1].len > 61) {
288 ret = -EOPNOTSUPP;
289 goto error;
290 }
Antti Palosaarif571e002011-11-28 20:58:11 -0300291 if (msg[i].addr == af9015_af9013_config[0].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300292 req.cmd = READ_MEMORY;
293 else
294 req.cmd = READ_I2C;
295 req.i2c_addr = msg[i].addr;
296 req.addr = addr;
297 req.mbox = mbox;
298 req.addr_len = addr_len;
299 req.data_len = msg[i+1].len;
300 req.data = &msg[i+1].buf[0];
301 ret = af9015_ctrl_msg(d, &req);
302 i += 2;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300303 } else if (msg[i].flags & I2C_M_RD) {
Antti Palosaari709d9202011-06-17 21:16:38 -0300304 if (msg[i].len > 61) {
305 ret = -EOPNOTSUPP;
306 goto error;
307 }
Jochen Friedrichd5633992009-02-02 14:59:50 -0300308 if (msg[i].addr ==
Antti Palosaarif571e002011-11-28 20:58:11 -0300309 af9015_af9013_config[0].i2c_addr) {
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300310 ret = -EINVAL;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300311 goto error;
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300312 }
313 req.cmd = READ_I2C;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300314 req.i2c_addr = msg[i].addr;
315 req.addr = addr;
316 req.mbox = mbox;
317 req.addr_len = addr_len;
318 req.data_len = msg[i].len;
319 req.data = &msg[i].buf[0];
320 ret = af9015_ctrl_msg(d, &req);
321 i += 1;
Antti Palosaari80619de2008-09-15 17:18:09 -0300322 } else {
Antti Palosaari709d9202011-06-17 21:16:38 -0300323 if (msg[i].len > 21) {
324 ret = -EOPNOTSUPP;
325 goto error;
326 }
Antti Palosaarif571e002011-11-28 20:58:11 -0300327 if (msg[i].addr == af9015_af9013_config[0].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300328 req.cmd = WRITE_MEMORY;
329 else
330 req.cmd = WRITE_I2C;
331 req.i2c_addr = msg[i].addr;
332 req.addr = addr;
333 req.mbox = mbox;
334 req.addr_len = addr_len;
335 req.data_len = msg[i].len-addr_len;
336 req.data = &msg[i].buf[addr_len];
337 ret = af9015_ctrl_msg(d, &req);
338 i += 1;
339 }
340 if (ret)
341 goto error;
342
343 }
344 ret = i;
345
346error:
347 mutex_unlock(&d->i2c_mutex);
348
349 return ret;
350}
351
352static u32 af9015_i2c_func(struct i2c_adapter *adapter)
353{
354 return I2C_FUNC_I2C;
355}
356
357static struct i2c_algorithm af9015_i2c_algo = {
358 .master_xfer = af9015_i2c_xfer,
359 .functionality = af9015_i2c_func,
360};
361
362static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op)
363{
364 int ret;
365 u8 val, mask = 0x01;
366
367 ret = af9015_read_reg(d, addr, &val);
368 if (ret)
369 return ret;
370
371 mask <<= bit;
372 if (op) {
373 /* set bit */
374 val |= mask;
375 } else {
376 /* clear bit */
377 mask ^= 0xff;
378 val &= mask;
379 }
380
381 return af9015_write_reg(d, addr, val);
382}
383
384static int af9015_set_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
385{
386 return af9015_do_reg_bit(d, addr, bit, 1);
387}
388
389static int af9015_clear_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
390{
391 return af9015_do_reg_bit(d, addr, bit, 0);
392}
393
394static int af9015_init_endpoint(struct dvb_usb_device *d)
395{
396 int ret;
397 u16 frame_size;
398 u8 packet_size;
399 deb_info("%s: USB speed:%d\n", __func__, d->udev->speed);
400
Antti Palosaari9c863272009-09-12 13:35:29 -0300401 /* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0.
402 We use smaller - about 1/4 from the original, 5 and 87. */
Antti Palosaari80619de2008-09-15 17:18:09 -0300403#define TS_PACKET_SIZE 188
404
Antti Palosaari9c863272009-09-12 13:35:29 -0300405#define TS_USB20_PACKET_COUNT 87
Antti Palosaari80619de2008-09-15 17:18:09 -0300406#define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT)
407
Antti Palosaari9c863272009-09-12 13:35:29 -0300408#define TS_USB11_PACKET_COUNT 5
Antti Palosaari80619de2008-09-15 17:18:09 -0300409#define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT)
410
411#define TS_USB20_MAX_PACKET_SIZE 512
412#define TS_USB11_MAX_PACKET_SIZE 64
413
414 if (d->udev->speed == USB_SPEED_FULL) {
415 frame_size = TS_USB11_FRAME_SIZE/4;
416 packet_size = TS_USB11_MAX_PACKET_SIZE/4;
417 } else {
418 frame_size = TS_USB20_FRAME_SIZE/4;
419 packet_size = TS_USB20_MAX_PACKET_SIZE/4;
420 }
421
422 ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
423 if (ret)
424 goto error;
425 ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
426 if (ret)
427 goto error;
428 ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
429 if (ret)
430 goto error;
431 ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
432 if (ret)
433 goto error;
434 ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
435 if (ret)
436 goto error;
437 if (af9015_config.dual_mode) {
438 ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
439 if (ret)
440 goto error;
441 }
442 ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
443 if (ret)
444 goto error;
445 if (af9015_config.dual_mode) {
446 ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
447 if (ret)
448 goto error;
449 }
450 /* EP4 xfer length */
451 ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
452 if (ret)
453 goto error;
454 ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
455 if (ret)
456 goto error;
457 /* EP5 xfer length */
458 ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
459 if (ret)
460 goto error;
461 ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
462 if (ret)
463 goto error;
464 ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
465 if (ret)
466 goto error;
467 ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
468 if (ret)
469 goto error;
470 ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
471 if (ret)
472 goto error;
473 if (af9015_config.dual_mode) {
474 ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
475 if (ret)
476 goto error;
477 }
478
479 /* enable / disable mp2if2 */
480 if (af9015_config.dual_mode)
481 ret = af9015_set_reg_bit(d, 0xd50b, 0);
482 else
483 ret = af9015_clear_reg_bit(d, 0xd50b, 0);
Antti Palosaari1e8750c2011-03-18 19:36:42 -0300484
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,
Antti Palosaarif571e002011-11-28 20:58:11 -0300509 af9015_af9013_config[1].i2c_addr, 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 */
Antti Palosaarif571e002011-11-28 20:58:11 -0300537 ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].i2c_addr,
Antti Palosaari80619de2008-09-15 17:18:09 -0300538 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,
Antti Palosaarif571e002011-11-28 20:58:11 -0300548 af9015_af9013_config[1].i2c_addr, 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300549 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
Antti Palosaari1e8750c2011-03-18 19:36:42 -0300617 /* init RC canary */
618 ret = af9015_write_reg(d, 0x98e9, 0xff);
619 if (ret)
620 goto error;
621
Antti Palosaari80619de2008-09-15 17:18:09 -0300622 ret = af9015_init_endpoint(d);
623 if (ret)
624 goto error;
625
Antti Palosaari80619de2008-09-15 17:18:09 -0300626error:
627 return ret;
628}
629
630static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
631{
632 int ret;
633 deb_info("%s: onoff:%d\n", __func__, onoff);
634
635 if (onoff)
636 ret = af9015_set_reg_bit(adap->dev, 0xd503, 0);
637 else
638 ret = af9015_clear_reg_bit(adap->dev, 0xd503, 0);
639
640 return ret;
641}
642
643static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
644 int onoff)
645{
646 int ret;
647 u8 idx;
648
649 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
650 __func__, index, pid, onoff);
651
652 ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
653 if (ret)
654 goto error;
655
656 ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
657 if (ret)
658 goto error;
659
660 idx = ((index & 0x1f) | (1 << 5));
661 ret = af9015_write_reg(adap->dev, 0xd504, idx);
662
663error:
664 return ret;
665}
666
667static int af9015_download_firmware(struct usb_device *udev,
668 const struct firmware *fw)
669{
Antti Palosaari582e5652011-03-19 16:51:43 -0300670 int i, len, remaining, ret;
Antti Palosaari80619de2008-09-15 17:18:09 -0300671 struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL};
Antti Palosaari80619de2008-09-15 17:18:09 -0300672 u16 checksum = 0;
673
674 deb_info("%s:\n", __func__);
675
676 /* calc checksum */
677 for (i = 0; i < fw->size; i++)
678 checksum += fw->data[i];
679
680 af9015_config.firmware_size = fw->size;
681 af9015_config.firmware_checksum = checksum;
682
Antti Palosaari582e5652011-03-19 16:51:43 -0300683 #define FW_ADDR 0x5100 /* firmware start address */
684 #define LEN_MAX 55 /* max packet size */
685 for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) {
686 len = remaining;
687 if (len > LEN_MAX)
688 len = LEN_MAX;
Antti Palosaari80619de2008-09-15 17:18:09 -0300689
690 req.data_len = len;
Antti Palosaari582e5652011-03-19 16:51:43 -0300691 req.data = (u8 *) &fw->data[fw->size - remaining];
692 req.addr = FW_ADDR + fw->size - remaining;
Antti Palosaari80619de2008-09-15 17:18:09 -0300693
694 ret = af9015_rw_udev(udev, &req);
695 if (ret) {
Antti Palosaari582e5652011-03-19 16:51:43 -0300696 err("firmware download failed:%d", ret);
Antti Palosaari80619de2008-09-15 17:18:09 -0300697 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 */
Juergen Lock879b0d72011-06-12 17:25:12 -0300740 { 0x5d49e3db, RC_MAP_DIGITTRADE }, /* LC-Power LC-USB-DVBT */
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300741 { }
742};
743
Antti Palosaari1cd72782010-10-12 17:22:32 -0300744static const struct af9015_rc_setup af9015_rc_setup_usbids[] = {
Antti Palosaarif68baef2011-07-28 19:17:59 -0300745 { (USB_VID_TERRATEC << 16) | USB_PID_TERRATEC_CINERGY_T_STICK_RC,
Antti Palosaari04599c22011-03-19 14:25:36 -0300746 RC_MAP_TERRATEC_SLIM_2 },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300747 { (USB_VID_TERRATEC << 16) | USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
Antti Palosaari1cd72782010-10-12 17:22:32 -0300748 RC_MAP_TERRATEC_SLIM },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300749 { (USB_VID_VISIONPLUS << 16) | USB_PID_AZUREWAVE_AD_TU700,
Antti Palosaari1cd72782010-10-12 17:22:32 -0300750 RC_MAP_AZUREWAVE_AD_TU700 },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300751 { (USB_VID_VISIONPLUS << 16) | USB_PID_TINYTWIN,
Antti Palosaari1cd72782010-10-12 17:22:32 -0300752 RC_MAP_AZUREWAVE_AD_TU700 },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300753 { (USB_VID_MSI_2 << 16) | USB_PID_MSI_DIGI_VOX_MINI_III,
Antti Palosaari1cd72782010-10-12 17:22:32 -0300754 RC_MAP_MSI_DIGIVOX_III },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300755 { (USB_VID_MSI_2 << 16) | USB_PID_MSI_DIGIVOX_DUO,
Antti Palosaariae81aab2011-06-15 11:29:47 -0300756 RC_MAP_MSI_DIGIVOX_III },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300757 { (USB_VID_LEADTEK << 16) | USB_PID_WINFAST_DTV_DONGLE_GOLD,
Antti Palosaari1cd72782010-10-12 17:22:32 -0300758 RC_MAP_LEADTEK_Y04G0051 },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300759 { (USB_VID_LEADTEK << 16) | USB_PID_WINFAST_DTV2000DS,
Antti Palosaari4c0cfa22011-07-28 19:15:38 -0300760 RC_MAP_LEADTEK_Y04G0051 },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300761 { (USB_VID_AVERMEDIA << 16) | USB_PID_AVERMEDIA_VOLAR_X,
Antti Palosaari1cd72782010-10-12 17:22:32 -0300762 RC_MAP_AVERMEDIA_M135A },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300763 { (USB_VID_AFATECH << 16) | USB_PID_TREKSTOR_DVBT,
Antti Palosaari1cd72782010-10-12 17:22:32 -0300764 RC_MAP_TREKSTOR },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300765 { (USB_VID_KWORLD_2 << 16) | USB_PID_TINYTWIN_2,
Antti Palosaaribd864ce2010-10-22 20:37:11 -0300766 RC_MAP_DIGITALNOW_TINYTWIN },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300767 { (USB_VID_GTEK << 16) | USB_PID_TINYTWIN_3,
Antti Palosaarif8c61272010-10-23 07:35:31 -0300768 RC_MAP_DIGITALNOW_TINYTWIN },
Antti Palosaarif68baef2011-07-28 19:17:59 -0300769 { (USB_VID_KWORLD_2 << 16) | USB_PID_SVEON_STV22,
Emilio David Diaus Lopeza062d042011-07-12 19:53:39 -0300770 RC_MAP_MSI_DIGIVOX_III },
Jiri Slabye3a0cc62010-01-22 12:10:55 -0300771 { }
772};
773
Jiri Slaby634d2d72010-01-22 12:10:53 -0300774static void af9015_set_remote_config(struct usb_device *udev,
775 struct dvb_usb_device_properties *props)
776{
Antti Palosaari1cd72782010-10-12 17:22:32 -0300777 u16 vid = le16_to_cpu(udev->descriptor.idVendor);
778 u16 pid = le16_to_cpu(udev->descriptor.idProduct);
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300779
Antti Palosaari1cd72782010-10-12 17:22:32 -0300780 /* try to load remote based module param */
781 props->rc.core.rc_codes = af9015_rc_setup_match(
782 dvb_usb_af9015_remote, af9015_rc_setup_modparam);
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300783
Antti Palosaari1cd72782010-10-12 17:22:32 -0300784 /* try to load remote based eeprom hash */
785 if (!props->rc.core.rc_codes)
786 props->rc.core.rc_codes = af9015_rc_setup_match(
787 af9015_config.eeprom_sum, af9015_rc_setup_hashes);
Jiri Slabye3a0cc62010-01-22 12:10:55 -0300788
Antti Palosaari1cd72782010-10-12 17:22:32 -0300789 /* try to load remote based USB ID */
790 if (!props->rc.core.rc_codes)
791 props->rc.core.rc_codes = af9015_rc_setup_match(
792 (vid << 16) + pid, af9015_rc_setup_usbids);
793
794 /* try to load remote based USB iManufacturer string */
795 if (!props->rc.core.rc_codes && vid == USB_VID_AFATECH) {
796 /* Check USB manufacturer and product strings and try
797 to determine correct remote in case of chip vendor
798 reference IDs are used.
799 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
800 char manufacturer[10];
801 memset(manufacturer, 0, sizeof(manufacturer));
802 usb_string(udev, udev->descriptor.iManufacturer,
803 manufacturer, sizeof(manufacturer));
804 if (!strcmp("MSI", manufacturer)) {
805 /* iManufacturer 1 MSI
806 iProduct 2 MSI K-VOX */
807 props->rc.core.rc_codes = af9015_rc_setup_match(
808 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
809 af9015_rc_setup_modparam);
810 }
Jiri Slaby26c3b8b2010-01-22 12:10:54 -0300811 }
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300812
813 /* finally load "empty" just for leaving IR receiver enabled */
814 if (!props->rc.core.rc_codes)
815 props->rc.core.rc_codes = RC_MAP_EMPTY;
816
Antti Palosaari1cd72782010-10-12 17:22:32 -0300817 return;
Jiri Slaby634d2d72010-01-22 12:10:53 -0300818}
819
Antti Palosaari80619de2008-09-15 17:18:09 -0300820static int af9015_read_config(struct usb_device *udev)
821{
822 int ret;
823 u8 val, i, offset = 0;
824 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
Antti Palosaari80619de2008-09-15 17:18:09 -0300825
826 /* IR remote controller */
827 req.addr = AF9015_EEPROM_IR_MODE;
Antti Palosaarid1a470f2009-01-20 14:56:20 -0300828 /* first message will timeout often due to possible hw bug */
829 for (i = 0; i < 4; i++) {
830 ret = af9015_rw_udev(udev, &req);
831 if (!ret)
832 break;
833 }
Antti Palosaari80619de2008-09-15 17:18:09 -0300834 if (ret)
835 goto error;
Jiri Slaby6c614042010-01-22 12:10:52 -0300836
837 ret = af9015_eeprom_hash(udev);
838 if (ret)
839 goto error;
840
Antti Palosaarif571e002011-11-28 20:58:11 -0300841 deb_info("%s: IR mode=%d\n", __func__, val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300842 for (i = 0; i < af9015_properties_count; i++) {
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300843 if (val == AF9015_IR_MODE_DISABLED)
844 af9015_properties[i].rc.core.rc_codes = NULL;
845 else
Jiri Slaby634d2d72010-01-22 12:10:53 -0300846 af9015_set_remote_config(udev, &af9015_properties[i]);
Antti Palosaari80619de2008-09-15 17:18:09 -0300847 }
848
849 /* TS mode - one or two receivers */
850 req.addr = AF9015_EEPROM_TS_MODE;
851 ret = af9015_rw_udev(udev, &req);
852 if (ret)
853 goto error;
854 af9015_config.dual_mode = val;
Antti Palosaarif571e002011-11-28 20:58:11 -0300855 deb_info("%s: TS mode=%d\n", __func__, af9015_config.dual_mode);
Antti Palosaari80619de2008-09-15 17:18:09 -0300856
Antti Palosaarif0830eb2009-01-13 13:08:29 -0300857 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
858 size can be static because it is enabled only USB2.0 */
Antti Palosaari80619de2008-09-15 17:18:09 -0300859 for (i = 0; i < af9015_properties_count; i++) {
860 /* USB1.1 set smaller buffersize and disable 2nd adapter */
861 if (udev->speed == USB_SPEED_FULL) {
Michael Krufky77eed212011-09-06 09:31:57 -0300862 af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
Antti Palosaari9c863272009-09-12 13:35:29 -0300863 = TS_USB11_FRAME_SIZE;
Antti Palosaari80619de2008-09-15 17:18:09 -0300864 /* disable 2nd adapter because we don't have
865 PID-filters */
866 af9015_config.dual_mode = 0;
867 } else {
Michael Krufky77eed212011-09-06 09:31:57 -0300868 af9015_properties[i].adapter[0].fe[0].stream.u.bulk.buffersize
Jose Alberto Reguero353330c2009-09-12 09:51:36 -0300869 = TS_USB20_FRAME_SIZE;
Antti Palosaari80619de2008-09-15 17:18:09 -0300870 }
871 }
872
873 if (af9015_config.dual_mode) {
874 /* read 2nd demodulator I2C address */
875 req.addr = AF9015_EEPROM_DEMOD2_I2C;
876 ret = af9015_rw_udev(udev, &req);
877 if (ret)
878 goto error;
Antti Palosaarif571e002011-11-28 20:58:11 -0300879 af9015_af9013_config[1].i2c_addr = val;
Antti Palosaari80619de2008-09-15 17:18:09 -0300880
881 /* enable 2nd adapter */
882 for (i = 0; i < af9015_properties_count; i++)
883 af9015_properties[i].num_adapters = 2;
884
885 } else {
886 /* disable 2nd adapter */
887 for (i = 0; i < af9015_properties_count; i++)
888 af9015_properties[i].num_adapters = 1;
889 }
890
891 for (i = 0; i < af9015_properties[0].num_adapters; i++) {
892 if (i == 1)
893 offset = AF9015_EEPROM_OFFSET;
894 /* xtal */
895 req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
896 ret = af9015_rw_udev(udev, &req);
897 if (ret)
898 goto error;
899 switch (val) {
900 case 0:
Antti Palosaarif571e002011-11-28 20:58:11 -0300901 af9015_af9013_config[i].clock = 28800000;
Antti Palosaari80619de2008-09-15 17:18:09 -0300902 break;
903 case 1:
Antti Palosaarif571e002011-11-28 20:58:11 -0300904 af9015_af9013_config[i].clock = 20480000;
Antti Palosaari80619de2008-09-15 17:18:09 -0300905 break;
906 case 2:
Antti Palosaarif571e002011-11-28 20:58:11 -0300907 af9015_af9013_config[i].clock = 28000000;
Antti Palosaari80619de2008-09-15 17:18:09 -0300908 break;
909 case 3:
Antti Palosaarif571e002011-11-28 20:58:11 -0300910 af9015_af9013_config[i].clock = 25000000;
Antti Palosaari80619de2008-09-15 17:18:09 -0300911 break;
912 };
Antti Palosaarif571e002011-11-28 20:58:11 -0300913 deb_info("%s: [%d] xtal=%d set clock=%d\n", __func__, i,
914 val, af9015_af9013_config[i].clock);
Antti Palosaari80619de2008-09-15 17:18:09 -0300915
Antti Palosaarif571e002011-11-28 20:58:11 -0300916 /* IF frequency */
Antti Palosaari80619de2008-09-15 17:18:09 -0300917 req.addr = AF9015_EEPROM_IF1H + offset;
918 ret = af9015_rw_udev(udev, &req);
919 if (ret)
920 goto error;
Antti Palosaarif571e002011-11-28 20:58:11 -0300921
922 af9015_af9013_config[i].if_frequency = val << 8;
923
Antti Palosaari80619de2008-09-15 17:18:09 -0300924 req.addr = AF9015_EEPROM_IF1L + offset;
925 ret = af9015_rw_udev(udev, &req);
926 if (ret)
927 goto error;
Antti Palosaarif571e002011-11-28 20:58:11 -0300928
929 af9015_af9013_config[i].if_frequency += val;
930 af9015_af9013_config[i].if_frequency *= 1000;
931 deb_info("%s: [%d] IF frequency=%d\n", __func__, i,
932 af9015_af9013_config[0].if_frequency);
Antti Palosaari80619de2008-09-15 17:18:09 -0300933
934 /* MT2060 IF1 */
935 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
936 ret = af9015_rw_udev(udev, &req);
937 if (ret)
938 goto error;
939 af9015_config.mt2060_if1[i] = val << 8;
940 req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
941 ret = af9015_rw_udev(udev, &req);
942 if (ret)
943 goto error;
944 af9015_config.mt2060_if1[i] += val;
Antti Palosaarif571e002011-11-28 20:58:11 -0300945 deb_info("%s: [%d] MT2060 IF1=%d\n", __func__, i,
Antti Palosaari80619de2008-09-15 17:18:09 -0300946 af9015_config.mt2060_if1[i]);
947
948 /* tuner */
949 req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
950 ret = af9015_rw_udev(udev, &req);
951 if (ret)
952 goto error;
953 switch (val) {
954 case AF9013_TUNER_ENV77H11D5:
955 case AF9013_TUNER_MT2060:
Antti Palosaari80619de2008-09-15 17:18:09 -0300956 case AF9013_TUNER_QT1010:
957 case AF9013_TUNER_UNKNOWN:
958 case AF9013_TUNER_MT2060_2:
959 case AF9013_TUNER_TDA18271:
960 case AF9013_TUNER_QT1010A:
Antti Palosaariee3d4402010-08-13 03:51:26 -0300961 case AF9013_TUNER_TDA18218:
Antti Palosaarif571e002011-11-28 20:58:11 -0300962 af9015_af9013_config[i].spec_inv = 1;
Antti Palosaari80619de2008-09-15 17:18:09 -0300963 break;
964 case AF9013_TUNER_MXL5003D:
965 case AF9013_TUNER_MXL5005D:
966 case AF9013_TUNER_MXL5005R:
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300967 case AF9013_TUNER_MXL5007T:
Antti Palosaarif571e002011-11-28 20:58:11 -0300968 af9015_af9013_config[i].spec_inv = 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300969 break;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300970 case AF9013_TUNER_MC44S803:
971 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
Antti Palosaarif571e002011-11-28 20:58:11 -0300972 af9015_af9013_config[i].spec_inv = 1;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300973 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300974 default:
Antti Palosaarif571e002011-11-28 20:58:11 -0300975 warn("tuner id=%d not supported, please report!", val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300976 return -ENODEV;
977 };
978
979 af9015_af9013_config[i].tuner = val;
Antti Palosaarif571e002011-11-28 20:58:11 -0300980 deb_info("%s: [%d] tuner id=%d\n", __func__, i, val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300981 }
982
983error:
984 if (ret)
Antti Palosaarif571e002011-11-28 20:58:11 -0300985 err("eeprom read failed=%d", ret);
Antti Palosaari80619de2008-09-15 17:18:09 -0300986
Antti Palosaari3956fef2009-03-31 17:01:02 -0300987 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -0300988 content :-( Override some wrong values here. Ditto for the
989 AVerTV Red HD+ (A850T) device. */
Antti Palosaari3956fef2009-03-31 17:01:02 -0300990 if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
Antti Palosaari9a3ecc72010-10-07 21:37:06 -0300991 ((le16_to_cpu(udev->descriptor.idProduct) ==
992 USB_PID_AVERMEDIA_A850) ||
993 (le16_to_cpu(udev->descriptor.idProduct) ==
994 USB_PID_AVERMEDIA_A850T))) {
Antti Palosaari3956fef2009-03-31 17:01:02 -0300995 deb_info("%s: AverMedia A850: overriding config\n", __func__);
996 /* disable dual mode */
997 af9015_config.dual_mode = 0;
998 /* disable 2nd adapter */
999 for (i = 0; i < af9015_properties_count; i++)
1000 af9015_properties[i].num_adapters = 1;
1001
1002 /* set correct IF */
Antti Palosaarif571e002011-11-28 20:58:11 -03001003 af9015_af9013_config[0].if_frequency = 4570000;
Antti Palosaari3956fef2009-03-31 17:01:02 -03001004 }
1005
Antti Palosaari80619de2008-09-15 17:18:09 -03001006 return ret;
1007}
1008
1009static int af9015_identify_state(struct usb_device *udev,
1010 struct dvb_usb_device_properties *props,
1011 struct dvb_usb_device_description **desc,
1012 int *cold)
1013{
1014 int ret;
1015 u8 reply;
1016 struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
1017
1018 ret = af9015_rw_udev(udev, &req);
1019 if (ret)
1020 return ret;
1021
1022 deb_info("%s: reply:%02x\n", __func__, reply);
1023 if (reply == 0x02)
1024 *cold = 0;
1025 else
1026 *cold = 1;
1027
1028 return ret;
1029}
1030
Antti Palosaari1cd72782010-10-12 17:22:32 -03001031static int af9015_rc_query(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -03001032{
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001033 struct af9015_state *priv = d->priv;
1034 int ret;
Ian Armstrongc1e13972011-03-18 19:23:05 -03001035 u8 buf[17];
Antti Palosaari80619de2008-09-15 17:18:09 -03001036
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001037 /* read registers needed to detect remote controller code */
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001038 ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
Antti Palosaari80619de2008-09-15 17:18:09 -03001039 if (ret)
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001040 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -03001041
Ian Armstrongc1e13972011-03-18 19:23:05 -03001042 /* If any of these are non-zero, assume invalid data */
1043 if (buf[1] || buf[2] || buf[3])
1044 return ret;
1045
1046 /* Check for repeat of previous code */
1047 if ((priv->rc_repeat != buf[6] || buf[0]) &&
1048 !memcmp(&buf[12], priv->rc_last, 4)) {
1049 deb_rc("%s: key repeated\n", __func__);
1050 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1051 priv->rc_repeat = buf[6];
1052 return ret;
1053 }
1054
1055 /* Only process key if canary killed */
1056 if (buf[16] != 0xff && buf[0] != 0x01) {
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001057 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
1058 buf[12], buf[13], buf[14], buf[15]);
Antti Palosaari80619de2008-09-15 17:18:09 -03001059
Antti Palosaari1e8750c2011-03-18 19:36:42 -03001060 /* Reset the canary */
1061 ret = af9015_write_reg(d, 0x98e9, 0xff);
1062 if (ret)
1063 goto error;
1064
Ian Armstrongc1e13972011-03-18 19:23:05 -03001065 /* Remember this key */
1066 memcpy(priv->rc_last, &buf[12], 4);
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001067 if (buf[14] == (u8) ~buf[15]) {
1068 if (buf[12] == (u8) ~buf[13]) {
Antti Palosaari1cd72782010-10-12 17:22:32 -03001069 /* NEC */
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001070 priv->rc_keycode = buf[12] << 8 | buf[14];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001071 } else {
1072 /* NEC extended*/
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001073 priv->rc_keycode = buf[12] << 16 |
1074 buf[13] << 8 | buf[14];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001075 }
Antti Palosaari1cd72782010-10-12 17:22:32 -03001076 } else {
Antti Palosaari1e8750c2011-03-18 19:36:42 -03001077 /* 32 bit NEC */
Ian Armstrongc1e13972011-03-18 19:23:05 -03001078 priv->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1079 buf[14] << 8 | buf[15];
Antti Palosaari1cd72782010-10-12 17:22:32 -03001080 }
Mauro Carvalho Chehabca866742010-11-17 13:53:11 -03001081 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001082 } else {
1083 deb_rc("%s: no key press\n", __func__);
Ian Armstrongc1e13972011-03-18 19:23:05 -03001084 /* Invalidate last keypress */
1085 /* Not really needed, but helps with debug */
1086 priv->rc_last[2] = priv->rc_last[3];
Antti Palosaari80619de2008-09-15 17:18:09 -03001087 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001088
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001089 priv->rc_repeat = buf[6];
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001090
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001091error:
1092 if (ret)
1093 err("%s: failed:%d", __func__, ret);
1094
1095 return ret;
Antti Palosaari80619de2008-09-15 17:18:09 -03001096}
1097
Antti Palosaarie90ab842011-11-12 22:33:30 -03001098/* override demod callbacks for resource locking */
Mauro Carvalho Chehab0009e0e2011-12-31 07:03:36 -03001099static int af9015_af9013_set_frontend(struct dvb_frontend *fe)
Antti Palosaarie90ab842011-11-12 22:33:30 -03001100{
1101 int ret;
1102 struct dvb_usb_adapter *adap = fe->dvb->priv;
1103 struct af9015_state *priv = adap->dev->priv;
1104
1105 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1106 return -EAGAIN;
1107
Mauro Carvalho Chehab0009e0e2011-12-31 07:03:36 -03001108 ret = priv->set_frontend[adap->id](fe);
Antti Palosaarie90ab842011-11-12 22:33:30 -03001109
1110 mutex_unlock(&adap->dev->usb_mutex);
1111
1112 return ret;
1113}
1114
1115/* override demod callbacks for resource locking */
1116static int af9015_af9013_read_status(struct dvb_frontend *fe,
1117 fe_status_t *status)
1118{
1119 int ret;
1120 struct dvb_usb_adapter *adap = fe->dvb->priv;
1121 struct af9015_state *priv = adap->dev->priv;
1122
1123 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1124 return -EAGAIN;
1125
1126 ret = priv->read_status[adap->id](fe, status);
1127
1128 mutex_unlock(&adap->dev->usb_mutex);
1129
1130 return ret;
1131}
1132
1133/* override demod callbacks for resource locking */
1134static int af9015_af9013_init(struct dvb_frontend *fe)
1135{
1136 int ret;
1137 struct dvb_usb_adapter *adap = fe->dvb->priv;
1138 struct af9015_state *priv = adap->dev->priv;
1139
1140 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1141 return -EAGAIN;
1142
1143 ret = priv->init[adap->id](fe);
1144
1145 mutex_unlock(&adap->dev->usb_mutex);
1146
1147 return ret;
1148}
1149
1150/* override demod callbacks for resource locking */
1151static int af9015_af9013_sleep(struct dvb_frontend *fe)
1152{
1153 int ret;
1154 struct dvb_usb_adapter *adap = fe->dvb->priv;
1155 struct af9015_state *priv = adap->dev->priv;
1156
1157 if (mutex_lock_interruptible(&adap->dev->usb_mutex))
1158 return -EAGAIN;
1159
Antti Palosaarif571e002011-11-28 20:58:11 -03001160 ret = priv->sleep[adap->id](fe);
Antti Palosaarie90ab842011-11-12 22:33:30 -03001161
1162 mutex_unlock(&adap->dev->usb_mutex);
1163
1164 return ret;
1165}
1166
Antti Palosaari80619de2008-09-15 17:18:09 -03001167static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1168{
1169 int ret;
Antti Palosaarie90ab842011-11-12 22:33:30 -03001170 struct af9015_state *state = adap->dev->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -03001171
Antti Palosaari713d9b52011-06-18 10:24:53 -03001172 if (adap->id == 1) {
Antti Palosaari80619de2008-09-15 17:18:09 -03001173 /* copy firmware to 2nd demodulator */
1174 if (af9015_config.dual_mode) {
1175 ret = af9015_copy_firmware(adap->dev);
1176 if (ret) {
1177 err("firmware copy to 2nd frontend " \
1178 "failed, will disable it");
1179 af9015_config.dual_mode = 0;
1180 return -ENODEV;
1181 }
1182 } else {
1183 return -ENODEV;
1184 }
1185 }
1186
1187 /* attach demodulator */
Michael Krufky77eed212011-09-06 09:31:57 -03001188 adap->fe_adap[0].fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
Antti Palosaari713d9b52011-06-18 10:24:53 -03001189 &adap->dev->i2c_adap);
Antti Palosaari80619de2008-09-15 17:18:09 -03001190
Antti Palosaarie90ab842011-11-12 22:33:30 -03001191 /*
1192 * AF9015 firmware does not like if it gets interrupted by I2C adapter
1193 * request on some critical phases. During normal operation I2C adapter
1194 * is used only 2nd demodulator and tuner on dual tuner devices.
1195 * Override demodulator callbacks and use mutex for limit access to
1196 * those "critical" paths to keep AF9015 happy.
1197 * Note: we abuse unused usb_mutex here.
1198 */
1199 if (adap->fe_adap[0].fe) {
1200 state->set_frontend[adap->id] =
1201 adap->fe_adap[0].fe->ops.set_frontend;
1202 adap->fe_adap[0].fe->ops.set_frontend =
1203 af9015_af9013_set_frontend;
1204
1205 state->read_status[adap->id] =
1206 adap->fe_adap[0].fe->ops.read_status;
1207 adap->fe_adap[0].fe->ops.read_status =
1208 af9015_af9013_read_status;
1209
1210 state->init[adap->id] = adap->fe_adap[0].fe->ops.init;
1211 adap->fe_adap[0].fe->ops.init = af9015_af9013_init;
1212
1213 state->sleep[adap->id] = adap->fe_adap[0].fe->ops.sleep;
1214 adap->fe_adap[0].fe->ops.sleep = af9015_af9013_sleep;
1215 }
1216
Michael Krufky77eed212011-09-06 09:31:57 -03001217 return adap->fe_adap[0].fe == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -03001218}
1219
1220static struct mt2060_config af9015_mt2060_config = {
1221 .i2c_address = 0xc0,
1222 .clock_out = 0,
1223};
1224
1225static struct qt1010_config af9015_qt1010_config = {
1226 .i2c_address = 0xc4,
1227};
1228
1229static struct tda18271_config af9015_tda18271_config = {
1230 .gate = TDA18271_GATE_DIGITAL,
Mauro Carvalho Chehab7655e592010-10-27 14:55:34 -02001231 .small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
Antti Palosaari80619de2008-09-15 17:18:09 -03001232};
1233
1234static struct mxl5005s_config af9015_mxl5003_config = {
1235 .i2c_address = 0xc6,
1236 .if_freq = IF_FREQ_4570000HZ,
1237 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1238 .agc_mode = MXL_SINGLE_AGC,
1239 .tracking_filter = MXL_TF_DEFAULT,
Antti Palosaaria1310772008-09-22 13:59:25 -03001240 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -03001241 .cap_select = MXL_CAP_SEL_ENABLE,
1242 .div_out = MXL_DIV_OUT_4,
1243 .clock_out = MXL_CLOCK_OUT_DISABLE,
1244 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1245 .top = MXL5005S_TOP_25P2,
1246 .mod_mode = MXL_DIGITAL_MODE,
1247 .if_mode = MXL_ZERO_IF,
1248 .AgcMasterByte = 0x00,
1249};
1250
1251static struct mxl5005s_config af9015_mxl5005_config = {
1252 .i2c_address = 0xc6,
1253 .if_freq = IF_FREQ_4570000HZ,
1254 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1255 .agc_mode = MXL_SINGLE_AGC,
1256 .tracking_filter = MXL_TF_OFF,
Antti Palosaaria1310772008-09-22 13:59:25 -03001257 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -03001258 .cap_select = MXL_CAP_SEL_ENABLE,
1259 .div_out = MXL_DIV_OUT_4,
1260 .clock_out = MXL_CLOCK_OUT_DISABLE,
1261 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1262 .top = MXL5005S_TOP_25P2,
1263 .mod_mode = MXL_DIGITAL_MODE,
1264 .if_mode = MXL_ZERO_IF,
1265 .AgcMasterByte = 0x00,
1266};
1267
Jochen Friedrichd5633992009-02-02 14:59:50 -03001268static struct mc44s803_config af9015_mc44s803_config = {
1269 .i2c_address = 0xc0,
1270 .dig_out = 1,
1271};
1272
Antti Palosaariee3d4402010-08-13 03:51:26 -03001273static struct tda18218_config af9015_tda18218_config = {
1274 .i2c_address = 0xc0,
1275 .i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
1276};
1277
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001278static struct mxl5007t_config af9015_mxl5007t_config = {
1279 .xtal_freq_hz = MxL_XTAL_24_MHZ,
1280 .if_freq_hz = MxL_IF_4_57_MHZ,
1281};
1282
Antti Palosaari80619de2008-09-15 17:18:09 -03001283static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
1284{
Antti Palosaari80619de2008-09-15 17:18:09 -03001285 int ret;
Antti Palosaari9a3ecc72010-10-07 21:37:06 -03001286 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001287
Antti Palosaari80619de2008-09-15 17:18:09 -03001288 switch (af9015_af9013_config[adap->id].tuner) {
1289 case AF9013_TUNER_MT2060:
1290 case AF9013_TUNER_MT2060_2:
Michael Krufky77eed212011-09-06 09:31:57 -03001291 ret = dvb_attach(mt2060_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -03001292 &af9015_mt2060_config,
1293 af9015_config.mt2060_if1[adap->id])
1294 == NULL ? -ENODEV : 0;
1295 break;
1296 case AF9013_TUNER_QT1010:
1297 case AF9013_TUNER_QT1010A:
Michael Krufky77eed212011-09-06 09:31:57 -03001298 ret = dvb_attach(qt1010_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -03001299 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
1300 break;
1301 case AF9013_TUNER_TDA18271:
Michael Krufky77eed212011-09-06 09:31:57 -03001302 ret = dvb_attach(tda18271_attach, adap->fe_adap[0].fe, 0xc0,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001303 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -03001304 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
1305 break;
Antti Palosaariee3d4402010-08-13 03:51:26 -03001306 case AF9013_TUNER_TDA18218:
Michael Krufky77eed212011-09-06 09:31:57 -03001307 ret = dvb_attach(tda18218_attach, adap->fe_adap[0].fe,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001308 &adap->dev->i2c_adap,
Antti Palosaariee3d4402010-08-13 03:51:26 -03001309 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
1310 break;
Antti Palosaari80619de2008-09-15 17:18:09 -03001311 case AF9013_TUNER_MXL5003D:
Michael Krufky77eed212011-09-06 09:31:57 -03001312 ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001313 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -03001314 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
1315 break;
1316 case AF9013_TUNER_MXL5005D:
1317 case AF9013_TUNER_MXL5005R:
Michael Krufky77eed212011-09-06 09:31:57 -03001318 ret = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001319 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -03001320 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
1321 break;
1322 case AF9013_TUNER_ENV77H11D5:
Michael Krufky77eed212011-09-06 09:31:57 -03001323 ret = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0xc0,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001324 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -03001325 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
1326 break;
1327 case AF9013_TUNER_MC44S803:
Michael Krufky77eed212011-09-06 09:31:57 -03001328 ret = dvb_attach(mc44s803_attach, adap->fe_adap[0].fe,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001329 &adap->dev->i2c_adap,
Jochen Friedrichd5633992009-02-02 14:59:50 -03001330 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -03001331 break;
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001332 case AF9013_TUNER_MXL5007T:
Michael Krufky77eed212011-09-06 09:31:57 -03001333 ret = dvb_attach(mxl5007t_attach, adap->fe_adap[0].fe,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001334 &adap->dev->i2c_adap,
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001335 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
1336 break;
Antti Palosaari80619de2008-09-15 17:18:09 -03001337 case AF9013_TUNER_UNKNOWN:
1338 default:
1339 ret = -ENODEV;
1340 err("Unknown tuner id:%d",
1341 af9015_af9013_config[adap->id].tuner);
1342 }
1343 return ret;
1344}
1345
Jonathan Niederd07b9012012-01-07 04:11:27 -03001346enum af9015_usb_table_entry {
1347 AFATECH_9015,
1348 AFATECH_9016,
1349 WINFAST_DTV_GOLD,
1350 PINNACLE_PCTV_71E,
1351 KWORLD_PLUSTV_399U,
1352 TINYTWIN,
1353 AZUREWAVE_TU700,
1354 TERRATEC_AF9015,
1355 KWORLD_PLUSTV_PC160,
1356 AVERTV_VOLAR_X,
1357 XTENSIONS_380U,
1358 MSI_DIGIVOX_DUO,
1359 AVERTV_VOLAR_X_REV2,
1360 TELESTAR_STARSTICK_2,
1361 AVERMEDIA_A309_USB,
1362 MSI_DIGIVOX_MINI_III,
1363 KWORLD_E396,
1364 KWORLD_E39B,
1365 KWORLD_E395,
1366 TREKSTOR_DVBT,
1367 AVERTV_A850,
1368 AVERTV_A805,
1369 CONCEPTRONIC_CTVDIGRCU,
1370 KWORLD_MC810,
1371 GENIUS_TVGO_DVB_T03,
1372 KWORLD_399U_2,
1373 KWORLD_PC160_T,
1374 SVEON_STV20,
1375 TINYTWIN_2,
1376 WINFAST_DTV2000DS,
1377 KWORLD_UB383_T,
1378 KWORLD_E39A,
1379 AVERMEDIA_A815M,
1380 CINERGY_T_STICK_RC,
1381 CINERGY_T_DUAL_RC,
1382 AVERTV_A850T,
1383 TINYTWIN_3,
1384 SVEON_STV22,
1385};
1386
Antti Palosaari80619de2008-09-15 17:18:09 -03001387static struct usb_device_id af9015_usb_table[] = {
Jonathan Niederd07b9012012-01-07 04:11:27 -03001388 [AFATECH_9015] =
1389 {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015)},
1390 [AFATECH_9016] =
1391 {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016)},
1392 [WINFAST_DTV_GOLD] =
1393 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD)},
1394 [PINNACLE_PCTV_71E] =
1395 {USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E)},
1396 [KWORLD_PLUSTV_399U] =
1397 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U)},
1398 [TINYTWIN] = {USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TINYTWIN)},
1399 [AZUREWAVE_TU700] =
1400 {USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_AZUREWAVE_AD_TU700)},
1401 [TERRATEC_AF9015] = {USB_DEVICE(USB_VID_TERRATEC,
1402 USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2)},
1403 [KWORLD_PLUSTV_PC160] =
1404 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T)},
1405 [AVERTV_VOLAR_X] =
1406 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X)},
1407 [XTENSIONS_380U] =
1408 {USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380)},
1409 [MSI_DIGIVOX_DUO] =
1410 {USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO)},
1411 [AVERTV_VOLAR_X_REV2] =
1412 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2)},
1413 [TELESTAR_STARSTICK_2] =
1414 {USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2)},
1415 [AVERMEDIA_A309_USB] =
1416 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309)},
1417 [MSI_DIGIVOX_MINI_III] =
1418 {USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III)},
1419 [KWORLD_E396] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U)},
1420 [KWORLD_E39B] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)},
1421 [KWORLD_E395] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)},
1422 [TREKSTOR_DVBT] = {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)},
1423 [AVERTV_A850] = {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)},
1424 [AVERTV_A805] = {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)},
1425 [CONCEPTRONIC_CTVDIGRCU] =
1426 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)},
1427 [KWORLD_MC810] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
1428 [GENIUS_TVGO_DVB_T03] =
1429 {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
1430 [KWORLD_399U_2] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
1431 [KWORLD_PC160_T] =
1432 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)},
1433 [SVEON_STV20] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)},
1434 [TINYTWIN_2] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2)},
1435 [WINFAST_DTV2000DS] =
1436 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS)},
1437 [KWORLD_UB383_T] =
1438 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T)},
1439 [KWORLD_E39A] =
1440 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4)},
1441 [AVERMEDIA_A815M] =
1442 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M)},
1443 [CINERGY_T_STICK_RC] = {USB_DEVICE(USB_VID_TERRATEC,
1444 USB_PID_TERRATEC_CINERGY_T_STICK_RC)},
1445 [CINERGY_T_DUAL_RC] = {USB_DEVICE(USB_VID_TERRATEC,
1446 USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC)},
1447 [AVERTV_A850T] =
1448 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T)},
1449 [TINYTWIN_3] = {USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3)},
1450 [SVEON_STV22] = {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22)},
1451 { }
Antti Palosaari80619de2008-09-15 17:18:09 -03001452};
1453MODULE_DEVICE_TABLE(usb, af9015_usb_table);
1454
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001455#define AF9015_RC_INTERVAL 500
Antti Palosaari80619de2008-09-15 17:18:09 -03001456static struct dvb_usb_device_properties af9015_properties[] = {
1457 {
1458 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1459
1460 .usb_ctrl = DEVICE_SPECIFIC,
1461 .download_firmware = af9015_download_firmware,
1462 .firmware = "dvb-usb-af9015.fw",
Jose Alberto Reguerocce25712008-11-13 14:14:18 -03001463 .no_reconnect = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001464
Antti Palosaari02542942009-09-16 20:33:03 -03001465 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari80619de2008-09-15 17:18:09 -03001466
1467 .num_adapters = 2,
1468 .adapter = {
1469 {
Michael Krufky77eed212011-09-06 09:31:57 -03001470 .num_frontends = 1,
1471 .fe = {{
Antti Palosaari80619de2008-09-15 17:18:09 -03001472 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1473 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1474
1475 .pid_filter_count = 32,
1476 .pid_filter = af9015_pid_filter,
1477 .pid_filter_ctrl = af9015_pid_filter_ctrl,
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 = 0x84,
1486 },
Michael Krufky77eed212011-09-06 09:31:57 -03001487 }},
Antti Palosaari80619de2008-09-15 17:18:09 -03001488 },
1489 {
Michael Krufky77eed212011-09-06 09:31:57 -03001490 .num_frontends = 1,
1491 .fe = {{
Antti Palosaari80619de2008-09-15 17:18:09 -03001492 .frontend_attach =
1493 af9015_af9013_frontend_attach,
1494 .tuner_attach = af9015_tuner_attach,
1495 .stream = {
1496 .type = USB_BULK,
1497 .count = 6,
1498 .endpoint = 0x85,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001499 .u = {
1500 .bulk = {
1501 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001502 TS_USB20_FRAME_SIZE,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001503 }
1504 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001505 },
Michael Krufky77eed212011-09-06 09:31:57 -03001506 }},
Antti Palosaari80619de2008-09-15 17:18:09 -03001507 }
1508 },
1509
1510 .identify_state = af9015_identify_state,
1511
Antti Palosaari1cd72782010-10-12 17:22:32 -03001512 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001513 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001514 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001515 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001516 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001517 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001518 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001519
1520 .i2c_algo = &af9015_i2c_algo,
1521
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001522 .num_device_descs = 12, /* check max from dvb-usb.h */
Antti Palosaari80619de2008-09-15 17:18:09 -03001523 .devices = {
1524 {
1525 .name = "Afatech AF9015 DVB-T USB2.0 stick",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001526 .cold_ids = {
1527 &af9015_usb_table[AFATECH_9015],
1528 &af9015_usb_table[AFATECH_9016],
1529 NULL
1530 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001531 .warm_ids = {NULL},
1532 },
1533 {
1534 .name = "Leadtek WinFast DTV Dongle Gold",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001535 .cold_ids = {
1536 &af9015_usb_table[WINFAST_DTV_GOLD],
1537 NULL
1538 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001539 .warm_ids = {NULL},
1540 },
1541 {
1542 .name = "Pinnacle PCTV 71e",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001543 .cold_ids = {
1544 &af9015_usb_table[PINNACLE_PCTV_71E],
1545 NULL
1546 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001547 .warm_ids = {NULL},
1548 },
1549 {
1550 .name = "KWorld PlusTV Dual DVB-T Stick " \
1551 "(DVB-T 399U)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001552 .cold_ids = {
1553 &af9015_usb_table[KWORLD_PLUSTV_399U],
1554 &af9015_usb_table[KWORLD_399U_2],
1555 NULL
1556 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001557 .warm_ids = {NULL},
1558 },
1559 {
1560 .name = "DigitalNow TinyTwin DVB-T Receiver",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001561 .cold_ids = {
1562 &af9015_usb_table[TINYTWIN],
1563 &af9015_usb_table[TINYTWIN_2],
1564 &af9015_usb_table[TINYTWIN_3],
1565 NULL
1566 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001567 .warm_ids = {NULL},
1568 },
1569 {
1570 .name = "TwinHan AzureWave AD-TU700(704J)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001571 .cold_ids = {
1572 &af9015_usb_table[AZUREWAVE_TU700],
1573 NULL
1574 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001575 .warm_ids = {NULL},
1576 },
1577 {
1578 .name = "TerraTec Cinergy T USB XE",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001579 .cold_ids = {
1580 &af9015_usb_table[TERRATEC_AF9015],
1581 NULL
1582 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001583 .warm_ids = {NULL},
1584 },
1585 {
1586 .name = "KWorld PlusTV Dual DVB-T PCI " \
1587 "(DVB-T PC160-2T)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001588 .cold_ids = {
1589 &af9015_usb_table[KWORLD_PLUSTV_PC160],
1590 NULL
1591 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001592 .warm_ids = {NULL},
1593 },
1594 {
1595 .name = "AVerMedia AVerTV DVB-T Volar X",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001596 .cold_ids = {
1597 &af9015_usb_table[AVERTV_VOLAR_X],
1598 NULL
1599 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001600 .warm_ids = {NULL},
1601 },
Antti Palosaari76391a72010-09-09 12:10:50 -03001602 {
1603 .name = "TerraTec Cinergy T Stick RC",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001604 .cold_ids = {
1605 &af9015_usb_table[CINERGY_T_STICK_RC],
1606 NULL
1607 },
Antti Palosaari76391a72010-09-09 12:10:50 -03001608 .warm_ids = {NULL},
1609 },
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001610 {
1611 .name = "TerraTec Cinergy T Stick Dual RC",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001612 .cold_ids = {
1613 &af9015_usb_table[CINERGY_T_DUAL_RC],
1614 NULL
1615 },
Antti Palosaariab07fdd2010-09-09 14:59:10 -03001616 .warm_ids = {NULL},
1617 },
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001618 {
1619 .name = "AverMedia AVerTV Red HD+ (A850T)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001620 .cold_ids = {
1621 &af9015_usb_table[AVERTV_A850T],
1622 NULL
1623 },
Yann E. MORIN8ccdf1a2010-10-01 16:55:43 -03001624 .warm_ids = {NULL},
1625 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001626 }
1627 }, {
1628 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1629
1630 .usb_ctrl = DEVICE_SPECIFIC,
1631 .download_firmware = af9015_download_firmware,
1632 .firmware = "dvb-usb-af9015.fw",
Jose Alberto Reguerocce25712008-11-13 14:14:18 -03001633 .no_reconnect = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001634
Antti Palosaari02542942009-09-16 20:33:03 -03001635 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari80619de2008-09-15 17:18:09 -03001636
1637 .num_adapters = 2,
1638 .adapter = {
1639 {
Michael Krufky77eed212011-09-06 09:31:57 -03001640 .num_frontends = 1,
1641 .fe = {{
Antti Palosaari80619de2008-09-15 17:18:09 -03001642 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1643 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1644
1645 .pid_filter_count = 32,
1646 .pid_filter = af9015_pid_filter,
1647 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1648
1649 .frontend_attach =
1650 af9015_af9013_frontend_attach,
1651 .tuner_attach = af9015_tuner_attach,
1652 .stream = {
1653 .type = USB_BULK,
1654 .count = 6,
1655 .endpoint = 0x84,
1656 },
Michael Krufky77eed212011-09-06 09:31:57 -03001657 }},
Antti Palosaari80619de2008-09-15 17:18:09 -03001658 },
1659 {
Michael Krufky77eed212011-09-06 09:31:57 -03001660 .num_frontends = 1,
1661 .fe = {{
Antti Palosaari80619de2008-09-15 17:18:09 -03001662 .frontend_attach =
1663 af9015_af9013_frontend_attach,
1664 .tuner_attach = af9015_tuner_attach,
1665 .stream = {
1666 .type = USB_BULK,
1667 .count = 6,
1668 .endpoint = 0x85,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001669 .u = {
1670 .bulk = {
1671 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001672 TS_USB20_FRAME_SIZE,
Antti Palosaarif0830eb2009-01-13 13:08:29 -03001673 }
1674 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001675 },
Michael Krufky77eed212011-09-06 09:31:57 -03001676 }},
Antti Palosaari80619de2008-09-15 17:18:09 -03001677 }
1678 },
1679
1680 .identify_state = af9015_identify_state,
1681
Antti Palosaari1cd72782010-10-12 17:22:32 -03001682 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001683 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001684 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001685 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001686 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001687 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001688 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001689
1690 .i2c_algo = &af9015_i2c_algo,
1691
Emilio David Diaus Lopeza062d042011-07-12 19:53:39 -03001692 .num_device_descs = 10, /* check max from dvb-usb.h */
Antti Palosaari80619de2008-09-15 17:18:09 -03001693 .devices = {
1694 {
1695 .name = "Xtensions XD-380",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001696 .cold_ids = {
1697 &af9015_usb_table[XTENSIONS_380U],
1698 NULL
1699 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001700 .warm_ids = {NULL},
1701 },
1702 {
1703 .name = "MSI DIGIVOX Duo",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001704 .cold_ids = {
1705 &af9015_usb_table[MSI_DIGIVOX_DUO],
1706 NULL
1707 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001708 .warm_ids = {NULL},
1709 },
1710 {
1711 .name = "Fujitsu-Siemens Slim Mobile USB DVB-T",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001712 .cold_ids = {
1713 &af9015_usb_table[AVERTV_VOLAR_X_REV2],
1714 NULL
1715 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001716 .warm_ids = {NULL},
1717 },
Mikko Ohtamaa111f9ec2008-09-19 18:26:05 -03001718 {
Antti Palosaaria3765882008-09-19 18:34:06 -03001719 .name = "Telestar Starstick 2",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001720 .cold_ids = {
1721 &af9015_usb_table[TELESTAR_STARSTICK_2],
1722 NULL
1723 },
Mikko Ohtamaa111f9ec2008-09-19 18:26:05 -03001724 .warm_ids = {NULL},
1725 },
Antti Palosaari05c1cab2008-09-22 12:32:37 -03001726 {
1727 .name = "AVerMedia A309",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001728 .cold_ids = {
1729 &af9015_usb_table[AVERMEDIA_A309_USB],
1730 NULL
1731 },
Antti Palosaari05c1cab2008-09-22 12:32:37 -03001732 .warm_ids = {NULL},
1733 },
Herbert Graeber641015a2008-10-07 10:06:36 -03001734 {
1735 .name = "MSI Digi VOX mini III",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001736 .cold_ids = {
1737 &af9015_usb_table[MSI_DIGIVOX_MINI_III],
1738 NULL
1739 },
Herbert Graeber641015a2008-10-07 10:06:36 -03001740 .warm_ids = {NULL},
1741 },
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001742 {
1743 .name = "KWorld USB DVB-T TV Stick II " \
1744 "(VS-DVB-T 395U)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001745 .cold_ids = {
1746 &af9015_usb_table[KWORLD_E396],
1747 &af9015_usb_table[KWORLD_E39B],
1748 &af9015_usb_table[KWORLD_E395],
1749 &af9015_usb_table[KWORLD_E39A],
1750 NULL
1751 },
Antti Palosaari163e9cd2008-11-04 12:57:47 -03001752 .warm_ids = {NULL},
1753 },
Marc Schneider26144842009-03-26 21:07:18 -03001754 {
1755 .name = "TrekStor DVB-T USB Stick",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001756 .cold_ids = {
1757 &af9015_usb_table[TREKSTOR_DVBT],
1758 NULL
1759 },
Marc Schneider26144842009-03-26 21:07:18 -03001760 .warm_ids = {NULL},
1761 },
Antti Palosaari3956fef2009-03-31 17:01:02 -03001762 {
1763 .name = "AverMedia AVerTV Volar Black HD " \
1764 "(A850)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001765 .cold_ids = {
1766 &af9015_usb_table[AVERTV_A850],
1767 NULL
1768 },
Antti Palosaari3956fef2009-03-31 17:01:02 -03001769 .warm_ids = {NULL},
1770 },
Emilio David Diaus Lopeza062d042011-07-12 19:53:39 -03001771 {
1772 .name = "Sveon STV22 Dual USB DVB-T Tuner HDTV",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001773 .cold_ids = {
1774 &af9015_usb_table[SVEON_STV22],
1775 NULL
1776 },
Emilio David Diaus Lopeza062d042011-07-12 19:53:39 -03001777 .warm_ids = {NULL},
1778 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001779 }
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001780 }, {
1781 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1782
1783 .usb_ctrl = DEVICE_SPECIFIC,
1784 .download_firmware = af9015_download_firmware,
1785 .firmware = "dvb-usb-af9015.fw",
1786 .no_reconnect = 1,
1787
Antti Palosaari02542942009-09-16 20:33:03 -03001788 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001789
1790 .num_adapters = 2,
1791 .adapter = {
1792 {
Michael Krufky77eed212011-09-06 09:31:57 -03001793 .num_frontends = 1,
1794 .fe = {{
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001795 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1796 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1797
1798 .pid_filter_count = 32,
1799 .pid_filter = af9015_pid_filter,
1800 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1801
1802 .frontend_attach =
1803 af9015_af9013_frontend_attach,
1804 .tuner_attach = af9015_tuner_attach,
1805 .stream = {
1806 .type = USB_BULK,
1807 .count = 6,
1808 .endpoint = 0x84,
1809 },
Michael Krufky77eed212011-09-06 09:31:57 -03001810 }},
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001811 },
1812 {
Michael Krufky77eed212011-09-06 09:31:57 -03001813 .num_frontends = 1,
1814 .fe = {{
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001815 .frontend_attach =
1816 af9015_af9013_frontend_attach,
1817 .tuner_attach = af9015_tuner_attach,
1818 .stream = {
1819 .type = USB_BULK,
1820 .count = 6,
1821 .endpoint = 0x85,
1822 .u = {
1823 .bulk = {
1824 .buffersize =
Jose Alberto Reguero353330c2009-09-12 09:51:36 -03001825 TS_USB20_FRAME_SIZE,
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001826 }
1827 }
1828 },
Michael Krufky77eed212011-09-06 09:31:57 -03001829 }},
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001830 }
1831 },
1832
1833 .identify_state = af9015_identify_state,
1834
Antti Palosaari1cd72782010-10-12 17:22:32 -03001835 .rc.core = {
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001836 .protocol = RC_TYPE_NEC,
Antti Palosaari1cd72782010-10-12 17:22:32 -03001837 .module_name = "af9015",
Antti Palosaari74c8e3a2010-10-22 18:45:18 -03001838 .rc_query = af9015_rc_query,
Antti Palosaarid3bb73d2010-09-12 13:31:56 -03001839 .rc_interval = AF9015_RC_INTERVAL,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001840 .allowed_protos = RC_TYPE_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001841 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001842
1843 .i2c_algo = &af9015_i2c_algo,
1844
Antti Palosaaria44b91d2010-09-09 12:05:31 -03001845 .num_device_descs = 9, /* check max from dvb-usb.h */
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001846 .devices = {
Antti Palosaari1ed5fad2009-04-09 15:14:18 -03001847 {
1848 .name = "AverMedia AVerTV Volar GPS 805 (A805)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001849 .cold_ids = {
1850 &af9015_usb_table[AVERTV_A805],
1851 NULL
1852 },
Antti Palosaari1ed5fad2009-04-09 15:14:18 -03001853 .warm_ids = {NULL},
1854 },
Marcel Jueling734dd232009-04-09 17:16:41 -03001855 {
1856 .name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1857 "V3.0",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001858 .cold_ids = {
1859 &af9015_usb_table[CONCEPTRONIC_CTVDIGRCU],
1860 NULL
1861 },
Marcel Jueling734dd232009-04-09 17:16:41 -03001862 .warm_ids = {NULL},
1863 },
Wen-chien Jesse Sung6e9c1a22009-04-28 01:11:22 -03001864 {
1865 .name = "KWorld Digial MC-810",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001866 .cold_ids = {
1867 &af9015_usb_table[KWORLD_MC810],
1868 NULL
1869 },
Wen-chien Jesse Sung6e9c1a22009-04-28 01:11:22 -03001870 .warm_ids = {NULL},
1871 },
Antti Palosaari22d46452009-05-31 17:07:01 -03001872 {
1873 .name = "Genius TVGo DVB-T03",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001874 .cold_ids = {
1875 &af9015_usb_table[GENIUS_TVGO_DVB_T03],
1876 NULL
1877 },
Antti Palosaari22d46452009-05-31 17:07:01 -03001878 .warm_ids = {NULL},
1879 },
Antti Palosaari486ba122009-09-18 13:37:57 -03001880 {
1881 .name = "KWorld PlusTV DVB-T PCI Pro Card " \
1882 "(DVB-T PC160-T)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001883 .cold_ids = {
1884 &af9015_usb_table[KWORLD_PC160_T],
1885 NULL
1886 },
Antti Palosaari486ba122009-09-18 13:37:57 -03001887 .warm_ids = {NULL},
1888 },
Ignacio de Miguel Diaz52322632009-11-13 23:13:34 -03001889 {
1890 .name = "Sveon STV20 Tuner USB DVB-T HDTV",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001891 .cold_ids = {
1892 &af9015_usb_table[SVEON_STV20],
1893 NULL
1894 },
Ignacio de Miguel Diaz52322632009-11-13 23:13:34 -03001895 .warm_ids = {NULL},
1896 },
Antti Palosaari809c1e82010-02-10 20:07:30 -03001897 {
1898 .name = "Leadtek WinFast DTV2000DS",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001899 .cold_ids = {
1900 &af9015_usb_table[WINFAST_DTV2000DS],
1901 NULL
1902 },
Antti Palosaari809c1e82010-02-10 20:07:30 -03001903 .warm_ids = {NULL},
1904 },
Antti Palosaariab9b4f22010-03-01 13:50:40 -03001905 {
1906 .name = "KWorld USB DVB-T Stick Mobile " \
1907 "(UB383-T)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001908 .cold_ids = {
1909 &af9015_usb_table[KWORLD_UB383_T],
1910 NULL
1911 },
Antti Palosaariab9b4f22010-03-01 13:50:40 -03001912 .warm_ids = {NULL},
1913 },
Antti Palosaari2606cfa2010-05-23 18:26:37 -03001914 {
1915 .name = "AverMedia AVerTV Volar M (A815Mac)",
Jonathan Niederd07b9012012-01-07 04:11:27 -03001916 .cold_ids = {
1917 &af9015_usb_table[AVERMEDIA_A815M],
1918 NULL
1919 },
Antti Palosaari2606cfa2010-05-23 18:26:37 -03001920 .warm_ids = {NULL},
1921 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001922 }
1923 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001924};
Antti Palosaari80619de2008-09-15 17:18:09 -03001925
1926static int af9015_usb_probe(struct usb_interface *intf,
1927 const struct usb_device_id *id)
1928{
1929 int ret = 0;
1930 struct dvb_usb_device *d = NULL;
1931 struct usb_device *udev = interface_to_usbdev(intf);
1932 u8 i;
1933
1934 deb_info("%s: interface:%d\n", __func__,
1935 intf->cur_altsetting->desc.bInterfaceNumber);
1936
1937 /* interface 0 is used by DVB-T receiver and
1938 interface 1 is for remote controller (HID) */
1939 if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
1940 ret = af9015_read_config(udev);
1941 if (ret)
1942 return ret;
1943
1944 for (i = 0; i < af9015_properties_count; i++) {
1945 ret = dvb_usb_device_init(intf, &af9015_properties[i],
1946 THIS_MODULE, &d, adapter_nr);
1947 if (!ret)
1948 break;
1949 if (ret != -ENODEV)
1950 return ret;
1951 }
1952 if (ret)
1953 return ret;
1954
1955 if (d)
1956 ret = af9015_init(d);
1957 }
1958
1959 return ret;
1960}
1961
Antti Palosaari80619de2008-09-15 17:18:09 -03001962/* usb specific object needed to register this driver with the usb subsystem */
1963static struct usb_driver af9015_usb_driver = {
1964 .name = "dvb_usb_af9015",
1965 .probe = af9015_usb_probe,
Antti Palosaari713d9b52011-06-18 10:24:53 -03001966 .disconnect = dvb_usb_device_exit,
Antti Palosaari80619de2008-09-15 17:18:09 -03001967 .id_table = af9015_usb_table,
1968};
1969
1970/* module stuff */
1971static int __init af9015_usb_module_init(void)
1972{
1973 int ret;
1974 ret = usb_register(&af9015_usb_driver);
1975 if (ret)
1976 err("module init failed:%d", ret);
1977
1978 return ret;
1979}
1980
1981static void __exit af9015_usb_module_exit(void)
1982{
1983 /* deregister this driver from the USB subsystem */
1984 usb_deregister(&af9015_usb_driver);
1985}
1986
1987module_init(af9015_usb_module_init);
1988module_exit(af9015_usb_module_exit);
1989
1990MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1991MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1992MODULE_LICENSE("GPL");