blob: 73ff4bbb89ce09909b49b707070856310bbebfec [file] [log] [blame]
Antti Palosaari80619de2008-09-15 17:18:09 -03001/*
2 * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
3 *
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5 *
6 * Thanks to Afatech who kindly provided information.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 */
23
24#include "af9015.h"
Antti Palosaari80619de2008-09-15 17:18:09 -030025
Antti Palosaari349d0422008-11-05 16:31:24 -030026static int dvb_usb_af9015_debug;
Antti Palosaari80619de2008-09-15 17:18:09 -030027module_param_named(debug, dvb_usb_af9015_debug, int, 0644);
28MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
Antti Palosaari349d0422008-11-05 16:31:24 -030029static int dvb_usb_af9015_remote;
Antti Palosaari80619de2008-09-15 17:18:09 -030030module_param_named(remote, dvb_usb_af9015_remote, int, 0644);
31MODULE_PARM_DESC(remote, "select remote");
Antti Palosaari80619de2008-09-15 17:18:09 -030032DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
33
Antti Palosaaria3645e52012-06-07 20:36:35 -030034static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req)
Antti Palosaari80619de2008-09-15 17:18:09 -030035{
Antti Palosaari06565d72009-09-12 20:46:30 -030036#define BUF_LEN 63
37#define REQ_HDR_LEN 8 /* send header size */
38#define ACK_HDR_LEN 2 /* rece header size */
Antti Palosaaria3645e52012-06-07 20:36:35 -030039 struct af9015_state *state = d->priv;
40 int ret, wlen, rlen;
Antti Palosaari06565d72009-09-12 20:46:30 -030041 u8 buf[BUF_LEN];
Antti Palosaari80619de2008-09-15 17:18:09 -030042 u8 write = 1;
Antti Palosaari80619de2008-09-15 17:18:09 -030043
44 buf[0] = req->cmd;
Antti Palosaaria3645e52012-06-07 20:36:35 -030045 buf[1] = state->seq++;
Antti Palosaari80619de2008-09-15 17:18:09 -030046 buf[2] = req->i2c_addr;
47 buf[3] = req->addr >> 8;
48 buf[4] = req->addr & 0xff;
49 buf[5] = req->mbox;
50 buf[6] = req->addr_len;
51 buf[7] = req->data_len;
52
53 switch (req->cmd) {
54 case GET_CONFIG:
Antti Palosaari80619de2008-09-15 17:18:09 -030055 case READ_MEMORY:
56 case RECONNECT_USB:
Antti Palosaari80619de2008-09-15 17:18:09 -030057 write = 0;
58 break;
59 case READ_I2C:
60 write = 0;
61 buf[2] |= 0x01; /* set I2C direction */
62 case WRITE_I2C:
63 buf[0] = READ_WRITE_I2C;
64 break;
65 case WRITE_MEMORY:
66 if (((req->addr & 0xff00) == 0xff00) ||
Antti Palosaarif4e96de2009-09-12 21:25:59 -030067 ((req->addr & 0xff00) == 0xae00))
Antti Palosaari80619de2008-09-15 17:18:09 -030068 buf[0] = WRITE_VIRTUAL_MEMORY;
69 case WRITE_VIRTUAL_MEMORY:
70 case COPY_FIRMWARE:
71 case DOWNLOAD_FIRMWARE:
Nils Kassubeba1bc642009-07-28 11:54:52 -030072 case BOOT:
Antti Palosaari80619de2008-09-15 17:18:09 -030073 break;
74 default:
75 err("unknown command:%d", req->cmd);
76 ret = -1;
Antti Palosaaria3645e52012-06-07 20:36:35 -030077 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -030078 }
79
Antti Palosaari06565d72009-09-12 20:46:30 -030080 /* buffer overflow check */
81 if ((write && (req->data_len > BUF_LEN - REQ_HDR_LEN)) ||
82 (!write && (req->data_len > BUF_LEN - ACK_HDR_LEN))) {
83 err("too much data; cmd:%d len:%d", req->cmd, req->data_len);
84 ret = -EINVAL;
Antti Palosaaria3645e52012-06-07 20:36:35 -030085 goto error;
Antti Palosaari06565d72009-09-12 20:46:30 -030086 }
87
Antti Palosaari06565d72009-09-12 20:46:30 -030088 /* write receives seq + status = 2 bytes
89 read receives seq + status + data = 2 + N bytes */
Antti Palosaaria3645e52012-06-07 20:36:35 -030090 wlen = REQ_HDR_LEN;
91 rlen = ACK_HDR_LEN;
92 if (write) {
93 wlen += req->data_len;
94 memcpy(&buf[REQ_HDR_LEN], req->data, req->data_len);
95 } else {
96 rlen += req->data_len;
Antti Palosaari80619de2008-09-15 17:18:09 -030097 }
98
Antti Palosaaria3645e52012-06-07 20:36:35 -030099 /* no ack for these packets */
100 if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB)
101 rlen = 0;
102
103 ret = dvb_usbv2_generic_rw(d, buf, wlen, buf, rlen, 0);
104 if (ret)
105 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -0300106
Antti Palosaari80619de2008-09-15 17:18:09 -0300107 /* check status */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300108 if (rlen && buf[1]) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300109 err("command failed:%d", buf[1]);
110 ret = -1;
Antti Palosaaria3645e52012-06-07 20:36:35 -0300111 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -0300112 }
113
114 /* read request, copy returned data to return buf */
115 if (!write)
Antti Palosaari06565d72009-09-12 20:46:30 -0300116 memcpy(req->data, &buf[ACK_HDR_LEN], req->data_len);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300117error:
Antti Palosaari80619de2008-09-15 17:18:09 -0300118 return ret;
119}
120
Antti Palosaari80619de2008-09-15 17:18:09 -0300121static int af9015_write_regs(struct dvb_usb_device *d, u16 addr, u8 *val,
122 u8 len)
123{
124 struct req_t req = {WRITE_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
125 val};
126 return af9015_ctrl_msg(d, &req);
127}
128
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300129static int af9015_read_regs(struct dvb_usb_device *d, u16 addr, u8 *val, u8 len)
130{
131 struct req_t req = {READ_MEMORY, AF9015_I2C_DEMOD, addr, 0, 0, len,
132 val};
133 return af9015_ctrl_msg(d, &req);
134}
135
Antti Palosaaria3645e52012-06-07 20:36:35 -0300136static int af9015_write_reg(struct dvb_usb_device *d, u16 addr, u8 val)
137{
138 return af9015_write_regs(d, addr, &val, 1);
139}
140
Antti Palosaari80619de2008-09-15 17:18:09 -0300141static int af9015_read_reg(struct dvb_usb_device *d, u16 addr, u8 *val)
142{
Antti Palosaari74c8e3a2010-10-22 18:45:18 -0300143 return af9015_read_regs(d, addr, val, 1);
Antti Palosaari80619de2008-09-15 17:18:09 -0300144}
145
146static int af9015_write_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
147 u8 val)
148{
Antti Palosaaria3645e52012-06-07 20:36:35 -0300149 struct af9015_state *state = d->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -0300150 struct req_t req = {WRITE_I2C, addr, reg, 1, 1, 1, &val};
151
Antti Palosaaria3645e52012-06-07 20:36:35 -0300152 if (addr == state->af9013_config[0].i2c_addr ||
153 addr == state->af9013_config[1].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300154 req.addr_len = 3;
155
156 return af9015_ctrl_msg(d, &req);
157}
158
159static int af9015_read_reg_i2c(struct dvb_usb_device *d, u8 addr, u16 reg,
160 u8 *val)
161{
Antti Palosaaria3645e52012-06-07 20:36:35 -0300162 struct af9015_state *state = d->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -0300163 struct req_t req = {READ_I2C, addr, reg, 0, 1, 1, val};
164
Antti Palosaaria3645e52012-06-07 20:36:35 -0300165 if (addr == state->af9013_config[0].i2c_addr ||
166 addr == state->af9013_config[1].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300167 req.addr_len = 3;
168
169 return af9015_ctrl_msg(d, &req);
170}
171
Antti Palosaaria3645e52012-06-07 20:36:35 -0300172static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op)
173{
174 int ret;
175 u8 val, mask = 0x01;
176
177 ret = af9015_read_reg(d, addr, &val);
178 if (ret)
179 return ret;
180
181 mask <<= bit;
182 if (op) {
183 /* set bit */
184 val |= mask;
185 } else {
186 /* clear bit */
187 mask ^= 0xff;
188 val &= mask;
189 }
190
191 return af9015_write_reg(d, addr, val);
192}
193
194static int af9015_set_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
195{
196 return af9015_do_reg_bit(d, addr, bit, 1);
197}
198
199static int af9015_clear_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit)
200{
201 return af9015_do_reg_bit(d, addr, bit, 0);
202}
203
Antti Palosaari80619de2008-09-15 17:18:09 -0300204static int af9015_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
205 int num)
206{
207 struct dvb_usb_device *d = i2c_get_adapdata(adap);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300208 struct af9015_state *state = d->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -0300209 int ret = 0, i = 0;
210 u16 addr;
Antti Palosaari675375d2010-10-07 21:46:41 -0300211 u8 uninitialized_var(mbox), addr_len;
Antti Palosaari80619de2008-09-15 17:18:09 -0300212 struct req_t req;
213
Antti Palosaaribc050e62012-05-08 06:04:24 -0300214/*
Antti Palosaari80619de2008-09-15 17:18:09 -0300215The bus lock is needed because there is two tuners both using same I2C-address.
216Due to that the only way to select correct tuner is use demodulator I2C-gate.
217
218................................................
219. AF9015 includes integrated AF9013 demodulator.
220. ____________ ____________ . ____________
221.| uC | | demod | . | tuner |
222.|------------| |------------| . |------------|
223.| AF9015 | | AF9013/5 | . | MXL5003 |
224.| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
225.| | | | addr 0x38 | . | addr 0xc6 |
226.|____________| | |____________| . |____________|
227.................|..............................
228 | ____________ ____________
229 | | demod | | tuner |
230 | |------------| |------------|
231 | | AF9013 | | MXL5003 |
232 +----I2C-------|-----/ -----|-------I2C-------| |
233 | addr 0x3a | | addr 0xc6 |
234 |____________| |____________|
235*/
236 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
237 return -EAGAIN;
238
239 while (i < num) {
Antti Palosaaria3645e52012-06-07 20:36:35 -0300240 if (msg[i].addr == state->af9013_config[0].i2c_addr ||
241 msg[i].addr == state->af9013_config[1].i2c_addr) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300242 addr = msg[i].buf[0] << 8;
243 addr += msg[i].buf[1];
244 mbox = msg[i].buf[2];
245 addr_len = 3;
246 } else {
247 addr = msg[i].buf[0];
248 addr_len = 1;
Antti Palosaari675375d2010-10-07 21:46:41 -0300249 /* mbox is don't care in that case */
Antti Palosaari80619de2008-09-15 17:18:09 -0300250 }
251
252 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
Antti Palosaari709d9202011-06-17 21:16:38 -0300253 if (msg[i].len > 3 || msg[i+1].len > 61) {
254 ret = -EOPNOTSUPP;
255 goto error;
256 }
Antti Palosaaria3645e52012-06-07 20:36:35 -0300257 if (msg[i].addr == state->af9013_config[0].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300258 req.cmd = READ_MEMORY;
259 else
260 req.cmd = READ_I2C;
261 req.i2c_addr = msg[i].addr;
262 req.addr = addr;
263 req.mbox = mbox;
264 req.addr_len = addr_len;
265 req.data_len = msg[i+1].len;
266 req.data = &msg[i+1].buf[0];
267 ret = af9015_ctrl_msg(d, &req);
268 i += 2;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300269 } else if (msg[i].flags & I2C_M_RD) {
Antti Palosaari709d9202011-06-17 21:16:38 -0300270 if (msg[i].len > 61) {
271 ret = -EOPNOTSUPP;
272 goto error;
273 }
Antti Palosaaria3645e52012-06-07 20:36:35 -0300274 if (msg[i].addr == state->af9013_config[0].i2c_addr) {
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300275 ret = -EINVAL;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300276 goto error;
Antti Palosaari16b2dc22011-06-16 20:02:41 -0300277 }
278 req.cmd = READ_I2C;
Jochen Friedrichd5633992009-02-02 14:59:50 -0300279 req.i2c_addr = msg[i].addr;
280 req.addr = addr;
281 req.mbox = mbox;
282 req.addr_len = addr_len;
283 req.data_len = msg[i].len;
284 req.data = &msg[i].buf[0];
285 ret = af9015_ctrl_msg(d, &req);
286 i += 1;
Antti Palosaari80619de2008-09-15 17:18:09 -0300287 } else {
Antti Palosaari709d9202011-06-17 21:16:38 -0300288 if (msg[i].len > 21) {
289 ret = -EOPNOTSUPP;
290 goto error;
291 }
Antti Palosaaria3645e52012-06-07 20:36:35 -0300292 if (msg[i].addr == state->af9013_config[0].i2c_addr)
Antti Palosaari80619de2008-09-15 17:18:09 -0300293 req.cmd = WRITE_MEMORY;
294 else
295 req.cmd = WRITE_I2C;
296 req.i2c_addr = msg[i].addr;
297 req.addr = addr;
298 req.mbox = mbox;
299 req.addr_len = addr_len;
300 req.data_len = msg[i].len-addr_len;
301 req.data = &msg[i].buf[addr_len];
302 ret = af9015_ctrl_msg(d, &req);
303 i += 1;
304 }
305 if (ret)
306 goto error;
307
308 }
309 ret = i;
310
311error:
312 mutex_unlock(&d->i2c_mutex);
313
314 return ret;
315}
316
317static u32 af9015_i2c_func(struct i2c_adapter *adapter)
318{
319 return I2C_FUNC_I2C;
320}
321
322static struct i2c_algorithm af9015_i2c_algo = {
323 .master_xfer = af9015_i2c_xfer,
324 .functionality = af9015_i2c_func,
325};
326
Antti Palosaaria3645e52012-06-07 20:36:35 -0300327static int af9015_identify_state(struct dvb_usb_device *d)
Antti Palosaari80619de2008-09-15 17:18:09 -0300328{
329 int ret;
Antti Palosaaria3645e52012-06-07 20:36:35 -0300330 u8 reply;
331 struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
Antti Palosaari80619de2008-09-15 17:18:09 -0300332
Antti Palosaaria3645e52012-06-07 20:36:35 -0300333 ret = af9015_ctrl_msg(d, &req);
Antti Palosaari80619de2008-09-15 17:18:09 -0300334 if (ret)
335 return ret;
336
Antti Palosaaria3645e52012-06-07 20:36:35 -0300337 deb_info("%s: reply:%02x\n", __func__, reply);
338 if (reply == 0x02)
339 ret = WARM;
Antti Palosaari80619de2008-09-15 17:18:09 -0300340 else
Antti Palosaaria3645e52012-06-07 20:36:35 -0300341 ret = COLD;
342
343 return ret;
344}
345
346static int af9015_download_firmware(struct dvb_usb_device *d,
347 const struct firmware *fw)
348{
349 struct af9015_state *state = d->priv;
350 int i, len, remaining, ret;
351 struct req_t req = {DOWNLOAD_FIRMWARE, 0, 0, 0, 0, 0, NULL};
352 u16 checksum = 0;
353
354 deb_info("%s:\n", __func__);
355
356 /* calc checksum */
357 for (i = 0; i < fw->size; i++)
358 checksum += fw->data[i];
359
360 state->firmware_size = fw->size;
361 state->firmware_checksum = checksum;
362
363 #define FW_ADDR 0x5100 /* firmware start address */
364 #define LEN_MAX 55 /* max packet size */
365 for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) {
366 len = remaining;
367 if (len > LEN_MAX)
368 len = LEN_MAX;
369
370 req.data_len = len;
371 req.data = (u8 *) &fw->data[fw->size - remaining];
372 req.addr = FW_ADDR + fw->size - remaining;
373
374 ret = af9015_ctrl_msg(d, &req);
375 if (ret) {
376 err("firmware download failed:%d", ret);
377 goto error;
378 }
379 }
380
381 /* firmware loaded, request boot */
382 req.cmd = BOOT;
383 req.data_len = 0;
384 ret = af9015_ctrl_msg(d, &req);
385 if (ret) {
386 err("firmware boot failed:%d", ret);
387 goto error;
388 }
389
390error:
391 return ret;
392}
393
394/* hash (and dump) eeprom */
395static int af9015_eeprom_hash(struct dvb_usb_device *d)
396{
397 struct af9015_state *state = d->priv;
398 int ret;
399 static const unsigned int eeprom_size = 256;
400 unsigned int reg;
401 u8 val, *eeprom;
402 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
403
404 eeprom = kmalloc(eeprom_size, GFP_KERNEL);
405 if (eeprom == NULL)
406 return -ENOMEM;
407
408 for (reg = 0; reg < eeprom_size; reg++) {
409 req.addr = reg;
410 ret = af9015_ctrl_msg(d, &req);
411 if (ret)
412 goto free;
413
414 eeprom[reg] = val;
415 }
416
417 if (dvb_usb_af9015_debug & 0x01)
418 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, eeprom,
419 eeprom_size);
420
421 BUG_ON(eeprom_size % 4);
422
423 state->eeprom_sum = 0;
424 for (reg = 0; reg < eeprom_size / sizeof(u32); reg++) {
425 state->eeprom_sum *= GOLDEN_RATIO_PRIME_32;
426 state->eeprom_sum += le32_to_cpu(((u32 *)eeprom)[reg]);
427 }
428
429 deb_info("%s: eeprom sum=%.8x\n", __func__, state->eeprom_sum);
430
431 ret = 0;
432free:
433 kfree(eeprom);
434 return ret;
435}
436
437static int af9015_read_config(struct dvb_usb_device *d)
438{
439 struct af9015_state *state = d->priv;
440 int ret;
441 u8 val, i, offset = 0;
442 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
443
444 deb_info("%s:\n", __func__);
445
446 /* IR remote controller */
447 req.addr = AF9015_EEPROM_IR_MODE;
448 /* first message will timeout often due to possible hw bug */
449 for (i = 0; i < 4; i++) {
450 ret = af9015_ctrl_msg(d, &req);
451 if (!ret)
452 break;
453 }
454 if (ret)
455 goto error;
456
457 ret = af9015_eeprom_hash(d);
458 if (ret)
459 goto error;
460
461 deb_info("%s: IR mode=%d\n", __func__, val);
462 state->ir_mode = val;
463
464 /* TS mode - one or two receivers */
465 req.addr = AF9015_EEPROM_TS_MODE;
466 ret = af9015_ctrl_msg(d, &req);
467 if (ret)
468 goto error;
469
470 state->dual_mode = val;
471 deb_info("%s: TS mode=%d\n", __func__, state->dual_mode);
472
473 /* disable 2nd adapter because we don't have PID-filters */
474 if (d->udev->speed == USB_SPEED_FULL)
475 state->dual_mode = 0;
476
477 if (state->dual_mode) {
478 /* read 2nd demodulator I2C address */
479 req.addr = AF9015_EEPROM_DEMOD2_I2C;
480 ret = af9015_ctrl_msg(d, &req);
481 if (ret)
482 goto error;
483
484 state->af9013_config[1].i2c_addr = val;
485 }
486
487 for (i = 0; i < state->dual_mode + 1; i++) {
488 if (i == 1)
489 offset = AF9015_EEPROM_OFFSET;
490 /* xtal */
491 req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
492 ret = af9015_ctrl_msg(d, &req);
493 if (ret)
494 goto error;
495 switch (val) {
496 case 0:
497 state->af9013_config[i].clock = 28800000;
498 break;
499 case 1:
500 state->af9013_config[i].clock = 20480000;
501 break;
502 case 2:
503 state->af9013_config[i].clock = 28000000;
504 break;
505 case 3:
506 state->af9013_config[i].clock = 25000000;
507 break;
508 };
509 deb_info("%s: [%d] xtal=%d set clock=%d\n", __func__, i,
510 val, state->af9013_config[i].clock);
511
512 /* IF frequency */
513 req.addr = AF9015_EEPROM_IF1H + offset;
514 ret = af9015_ctrl_msg(d, &req);
515 if (ret)
516 goto error;
517
518 state->af9013_config[i].if_frequency = val << 8;
519
520 req.addr = AF9015_EEPROM_IF1L + offset;
521 ret = af9015_ctrl_msg(d, &req);
522 if (ret)
523 goto error;
524
525 state->af9013_config[i].if_frequency += val;
526 state->af9013_config[i].if_frequency *= 1000;
527 deb_info("%s: [%d] IF frequency=%d\n", __func__, i,
528 state->af9013_config[i].if_frequency);
529
530 /* MT2060 IF1 */
531 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
532 ret = af9015_ctrl_msg(d, &req);
533 if (ret)
534 goto error;
535 state->mt2060_if1[i] = val << 8;
536 req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
537 ret = af9015_ctrl_msg(d, &req);
538 if (ret)
539 goto error;
540 state->mt2060_if1[i] += val;
541 deb_info("%s: [%d] MT2060 IF1=%d\n", __func__, i,
542 state->mt2060_if1[i]);
543
544 /* tuner */
545 req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
546 ret = af9015_ctrl_msg(d, &req);
547 if (ret)
548 goto error;
549 switch (val) {
550 case AF9013_TUNER_ENV77H11D5:
551 case AF9013_TUNER_MT2060:
552 case AF9013_TUNER_QT1010:
553 case AF9013_TUNER_UNKNOWN:
554 case AF9013_TUNER_MT2060_2:
555 case AF9013_TUNER_TDA18271:
556 case AF9013_TUNER_QT1010A:
557 case AF9013_TUNER_TDA18218:
558 state->af9013_config[i].spec_inv = 1;
559 break;
560 case AF9013_TUNER_MXL5003D:
561 case AF9013_TUNER_MXL5005D:
562 case AF9013_TUNER_MXL5005R:
563 case AF9013_TUNER_MXL5007T:
564 state->af9013_config[i].spec_inv = 0;
565 break;
566 case AF9013_TUNER_MC44S803:
567 state->af9013_config[i].gpio[1] = AF9013_GPIO_LO;
568 state->af9013_config[i].spec_inv = 1;
569 break;
570 default:
571 warn("tuner id=%d not supported, please report!", val);
572 return -ENODEV;
573 };
574
575 state->af9013_config[i].tuner = val;
576 deb_info("%s: [%d] tuner id=%d\n", __func__, i, val);
577 }
Antti Palosaari1e8750c2011-03-18 19:36:42 -0300578
Antti Palosaari80619de2008-09-15 17:18:09 -0300579error:
580 if (ret)
Antti Palosaaria3645e52012-06-07 20:36:35 -0300581 err("eeprom read failed=%d", ret);
582
583 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
584 content :-( Override some wrong values here. Ditto for the
585 AVerTV Red HD+ (A850T) device. */
586 if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
587 ((le16_to_cpu(d->udev->descriptor.idProduct) ==
588 USB_PID_AVERMEDIA_A850) ||
589 (le16_to_cpu(d->udev->descriptor.idProduct) ==
590 USB_PID_AVERMEDIA_A850T))) {
591 deb_info("%s: AverMedia A850: overriding config\n", __func__);
592 /* disable dual mode */
593 state->dual_mode = 0;
594
595 /* set correct IF */
596 state->af9013_config[0].if_frequency = 4570000;
597 }
598
599 return ret;
600}
601
602static int af9015_get_usb_stream_config(struct dvb_frontend *fe,
603 struct usb_data_stream_properties *stream)
604{
605 struct dvb_usb_adapter *adap;
606
607 deb_info("%s: fe=%p\n", __func__, fe);
608
609 stream->type = USB_BULK;
610 stream->count = 8;
611 stream->endpoint = 0x84;
612 stream->u.bulk.buffersize = TS_USB20_FRAME_SIZE;
613
614 if (fe == NULL)
615 return 0;
616
617 adap = fe->dvb->priv;
618
619 if (adap->id == 1)
620 stream->endpoint = 0x85;
621
622 if (adap->dev->udev->speed == USB_SPEED_FULL)
623 stream->u.bulk.buffersize = TS_USB11_FRAME_SIZE;
624
625 return 0;
626}
627
628static int af9015_get_adapter_count(struct dvb_usb_device *d)
629{
630 struct af9015_state *state = d->priv;
631 return state->dual_mode + 1;
632}
633
634/* override demod callbacks for resource locking */
635static int af9015_af9013_set_frontend(struct dvb_frontend *fe)
636{
637 int ret;
638 struct dvb_usb_adapter *adap = fe->dvb->priv;
639 struct af9015_state *state = adap->dev->priv;
640
641 if (mutex_lock_interruptible(&state->fe_mutex))
642 return -EAGAIN;
643
644 ret = state->set_frontend[adap->id](fe);
645
646 mutex_unlock(&state->fe_mutex);
647
648 return ret;
649}
650
651/* override demod callbacks for resource locking */
652static int af9015_af9013_read_status(struct dvb_frontend *fe,
653 fe_status_t *status)
654{
655 int ret;
656 struct dvb_usb_adapter *adap = fe->dvb->priv;
657 struct af9015_state *state = adap->dev->priv;
658
659 if (mutex_lock_interruptible(&state->fe_mutex))
660 return -EAGAIN;
661
662 ret = state->read_status[adap->id](fe, status);
663
664 mutex_unlock(&state->fe_mutex);
665
666 return ret;
667}
668
669/* override demod callbacks for resource locking */
670static int af9015_af9013_init(struct dvb_frontend *fe)
671{
672 int ret;
673 struct dvb_usb_adapter *adap = fe->dvb->priv;
674 struct af9015_state *state = adap->dev->priv;
675
676 if (mutex_lock_interruptible(&state->fe_mutex))
677 return -EAGAIN;
678
679 ret = state->init[adap->id](fe);
680
681 mutex_unlock(&state->fe_mutex);
682
683 return ret;
684}
685
686/* override demod callbacks for resource locking */
687static int af9015_af9013_sleep(struct dvb_frontend *fe)
688{
689 int ret;
690 struct dvb_usb_adapter *adap = fe->dvb->priv;
691 struct af9015_state *state = adap->dev->priv;
692
693 if (mutex_lock_interruptible(&state->fe_mutex))
694 return -EAGAIN;
695
696 ret = state->sleep[adap->id](fe);
697
698 mutex_unlock(&state->fe_mutex);
699
700 return ret;
701}
702
703/* override tuner callbacks for resource locking */
704static int af9015_tuner_init(struct dvb_frontend *fe)
705{
706 int ret;
707 struct dvb_usb_adapter *adap = fe->dvb->priv;
708 struct af9015_state *state = adap->dev->priv;
709
710 if (mutex_lock_interruptible(&state->fe_mutex))
711 return -EAGAIN;
712
713 ret = state->tuner_init[adap->id](fe);
714
715 mutex_unlock(&state->fe_mutex);
716
717 return ret;
718}
719
720/* override tuner callbacks for resource locking */
721static int af9015_tuner_sleep(struct dvb_frontend *fe)
722{
723 int ret;
724 struct dvb_usb_adapter *adap = fe->dvb->priv;
725 struct af9015_state *state = adap->dev->priv;
726
727 if (mutex_lock_interruptible(&state->fe_mutex))
728 return -EAGAIN;
729
730 ret = state->tuner_sleep[adap->id](fe);
731
732 mutex_unlock(&state->fe_mutex);
733
Antti Palosaari80619de2008-09-15 17:18:09 -0300734 return ret;
735}
736
737static int af9015_copy_firmware(struct dvb_usb_device *d)
738{
Antti Palosaaria3645e52012-06-07 20:36:35 -0300739 struct af9015_state *state = d->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -0300740 int ret;
741 u8 fw_params[4];
742 u8 val, i;
743 struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
744 fw_params };
745 deb_info("%s:\n", __func__);
746
Antti Palosaaria3645e52012-06-07 20:36:35 -0300747 fw_params[0] = state->firmware_size >> 8;
748 fw_params[1] = state->firmware_size & 0xff;
749 fw_params[2] = state->firmware_checksum >> 8;
750 fw_params[3] = state->firmware_checksum & 0xff;
Antti Palosaari80619de2008-09-15 17:18:09 -0300751
752 /* wait 2nd demodulator ready */
753 msleep(100);
754
Antti Palosaaria3645e52012-06-07 20:36:35 -0300755 ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
756 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300757 if (ret)
758 goto error;
759 else
760 deb_info("%s: firmware status:%02x\n", __func__, val);
761
762 if (val == 0x0c) /* fw is running, no need for download */
763 goto exit;
764
765 /* set I2C master clock to fast (to speed up firmware copy) */
766 ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
767 if (ret)
768 goto error;
769
770 msleep(50);
771
772 /* copy firmware */
773 ret = af9015_ctrl_msg(d, &req);
774 if (ret)
775 err("firmware copy cmd failed:%d", ret);
776 deb_info("%s: firmware copy done\n", __func__);
777
778 /* set I2C master clock back to normal */
779 ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
780 if (ret)
781 goto error;
782
783 /* request boot firmware */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300784 ret = af9015_write_reg_i2c(d, state->af9013_config[1].i2c_addr,
785 0xe205, 1);
Antti Palosaari80619de2008-09-15 17:18:09 -0300786 deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
787 if (ret)
788 goto error;
789
790 for (i = 0; i < 15; i++) {
791 msleep(100);
792
793 /* check firmware status */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300794 ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
795 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300796 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
797 __func__, ret, val);
798 if (ret)
799 goto error;
800
801 if (val == 0x0c || val == 0x04) /* success or fail */
802 break;
803 }
804
805 if (val == 0x04) {
806 err("firmware did not run");
807 ret = -1;
808 } else if (val != 0x0c) {
809 err("firmware boot timeout");
810 ret = -1;
811 }
812
813error:
814exit:
815 return ret;
816}
817
Antti Palosaari80619de2008-09-15 17:18:09 -0300818static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
819{
820 int ret;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300821 struct af9015_state *state = adap->dev->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -0300822
Antti Palosaaria3645e52012-06-07 20:36:35 -0300823 if (adap->id == 0) {
824 state->af9013_config[0].ts_mode = AF9013_TS_USB;
825 memcpy(state->af9013_config[0].api_version, "\x0\x1\x9\x0", 4);
826 state->af9013_config[0].gpio[0] = AF9013_GPIO_HI;
827 state->af9013_config[0].gpio[3] = AF9013_GPIO_TUNER_ON;
828 } else if (adap->id == 1) {
829 state->af9013_config[1].ts_mode = AF9013_TS_SERIAL;
830 memcpy(state->af9013_config[1].api_version, "\x0\x1\x9\x0", 4);
831 state->af9013_config[1].gpio[0] = AF9013_GPIO_TUNER_ON;
832 state->af9013_config[1].gpio[1] = AF9013_GPIO_LO;
833
Antti Palosaari80619de2008-09-15 17:18:09 -0300834 /* copy firmware to 2nd demodulator */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300835 if (state->dual_mode) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300836 ret = af9015_copy_firmware(adap->dev);
837 if (ret) {
838 err("firmware copy to 2nd frontend " \
839 "failed, will disable it");
Antti Palosaaria3645e52012-06-07 20:36:35 -0300840 state->dual_mode = 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300841 return -ENODEV;
842 }
843 } else {
844 return -ENODEV;
845 }
846 }
847
848 /* attach demodulator */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300849 adap->fe[0] = dvb_attach(af9013_attach,
850 &state->af9013_config[adap->id], &adap->dev->i2c_adap);
Antti Palosaari80619de2008-09-15 17:18:09 -0300851
Antti Palosaarie90ab842011-11-12 22:33:30 -0300852 /*
853 * AF9015 firmware does not like if it gets interrupted by I2C adapter
854 * request on some critical phases. During normal operation I2C adapter
855 * is used only 2nd demodulator and tuner on dual tuner devices.
856 * Override demodulator callbacks and use mutex for limit access to
857 * those "critical" paths to keep AF9015 happy.
Antti Palosaarie90ab842011-11-12 22:33:30 -0300858 */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300859 if (adap->fe[0]) {
Antti Palosaarie90ab842011-11-12 22:33:30 -0300860 state->set_frontend[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -0300861 adap->fe[0]->ops.set_frontend;
862 adap->fe[0]->ops.set_frontend =
Antti Palosaarie90ab842011-11-12 22:33:30 -0300863 af9015_af9013_set_frontend;
864
865 state->read_status[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -0300866 adap->fe[0]->ops.read_status;
867 adap->fe[0]->ops.read_status =
Antti Palosaarie90ab842011-11-12 22:33:30 -0300868 af9015_af9013_read_status;
869
Antti Palosaaria3645e52012-06-07 20:36:35 -0300870 state->init[adap->id] = adap->fe[0]->ops.init;
871 adap->fe[0]->ops.init = af9015_af9013_init;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300872
Antti Palosaaria3645e52012-06-07 20:36:35 -0300873 state->sleep[adap->id] = adap->fe[0]->ops.sleep;
874 adap->fe[0]->ops.sleep = af9015_af9013_sleep;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300875 }
876
Antti Palosaaria3645e52012-06-07 20:36:35 -0300877 return adap->fe[0] == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300878}
879
880static struct mt2060_config af9015_mt2060_config = {
881 .i2c_address = 0xc0,
882 .clock_out = 0,
883};
884
885static struct qt1010_config af9015_qt1010_config = {
886 .i2c_address = 0xc4,
887};
888
889static struct tda18271_config af9015_tda18271_config = {
890 .gate = TDA18271_GATE_DIGITAL,
Mauro Carvalho Chehab7655e592010-10-27 14:55:34 -0200891 .small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
Antti Palosaari80619de2008-09-15 17:18:09 -0300892};
893
894static struct mxl5005s_config af9015_mxl5003_config = {
895 .i2c_address = 0xc6,
896 .if_freq = IF_FREQ_4570000HZ,
897 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
898 .agc_mode = MXL_SINGLE_AGC,
899 .tracking_filter = MXL_TF_DEFAULT,
Antti Palosaaria1310772008-09-22 13:59:25 -0300900 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -0300901 .cap_select = MXL_CAP_SEL_ENABLE,
902 .div_out = MXL_DIV_OUT_4,
903 .clock_out = MXL_CLOCK_OUT_DISABLE,
904 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
905 .top = MXL5005S_TOP_25P2,
906 .mod_mode = MXL_DIGITAL_MODE,
907 .if_mode = MXL_ZERO_IF,
908 .AgcMasterByte = 0x00,
909};
910
911static struct mxl5005s_config af9015_mxl5005_config = {
912 .i2c_address = 0xc6,
913 .if_freq = IF_FREQ_4570000HZ,
914 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
915 .agc_mode = MXL_SINGLE_AGC,
916 .tracking_filter = MXL_TF_OFF,
Antti Palosaaria1310772008-09-22 13:59:25 -0300917 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -0300918 .cap_select = MXL_CAP_SEL_ENABLE,
919 .div_out = MXL_DIV_OUT_4,
920 .clock_out = MXL_CLOCK_OUT_DISABLE,
921 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
922 .top = MXL5005S_TOP_25P2,
923 .mod_mode = MXL_DIGITAL_MODE,
924 .if_mode = MXL_ZERO_IF,
925 .AgcMasterByte = 0x00,
926};
927
Jochen Friedrichd5633992009-02-02 14:59:50 -0300928static struct mc44s803_config af9015_mc44s803_config = {
929 .i2c_address = 0xc0,
930 .dig_out = 1,
931};
932
Antti Palosaariee3d4402010-08-13 03:51:26 -0300933static struct tda18218_config af9015_tda18218_config = {
934 .i2c_address = 0xc0,
935 .i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
936};
937
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300938static struct mxl5007t_config af9015_mxl5007t_config = {
939 .xtal_freq_hz = MxL_XTAL_24_MHZ,
940 .if_freq_hz = MxL_IF_4_57_MHZ,
941};
942
Antti Palosaari80619de2008-09-15 17:18:09 -0300943static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
944{
Gordon Heckerbe4a5e72012-03-14 10:27:30 -0300945 struct af9015_state *state = adap->dev->priv;
Antti Palosaaria3645e52012-06-07 20:36:35 -0300946 int ret;
Antti Palosaari9a3ecc72010-10-07 21:37:06 -0300947 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -0300948
Antti Palosaaria3645e52012-06-07 20:36:35 -0300949 switch (state->af9013_config[adap->id].tuner) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300950 case AF9013_TUNER_MT2060:
951 case AF9013_TUNER_MT2060_2:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300952 ret = dvb_attach(mt2060_attach, adap->fe[0],
Antti Palosaaribc050e62012-05-08 06:04:24 -0300953 &adap->dev->i2c_adap, &af9015_mt2060_config,
Antti Palosaaria3645e52012-06-07 20:36:35 -0300954 state->mt2060_if1[adap->id])
Antti Palosaari80619de2008-09-15 17:18:09 -0300955 == NULL ? -ENODEV : 0;
956 break;
957 case AF9013_TUNER_QT1010:
958 case AF9013_TUNER_QT1010A:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300959 ret = dvb_attach(qt1010_attach, adap->fe[0],
Antti Palosaaribc050e62012-05-08 06:04:24 -0300960 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300961 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
962 break;
963 case AF9013_TUNER_TDA18271:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300964 ret = dvb_attach(tda18271_attach, adap->fe[0], 0xc0,
Antti Palosaari713d9b52011-06-18 10:24:53 -0300965 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300966 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
967 break;
Antti Palosaariee3d4402010-08-13 03:51:26 -0300968 case AF9013_TUNER_TDA18218:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300969 ret = dvb_attach(tda18218_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300970 &adap->dev->i2c_adap,
Antti Palosaariee3d4402010-08-13 03:51:26 -0300971 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
972 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300973 case AF9013_TUNER_MXL5003D:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300974 ret = dvb_attach(mxl5005s_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300975 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300976 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
977 break;
978 case AF9013_TUNER_MXL5005D:
979 case AF9013_TUNER_MXL5005R:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300980 ret = dvb_attach(mxl5005s_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300981 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300982 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
983 break;
984 case AF9013_TUNER_ENV77H11D5:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300985 ret = dvb_attach(dvb_pll_attach, adap->fe[0], 0xc0,
Antti Palosaari713d9b52011-06-18 10:24:53 -0300986 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300987 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
988 break;
989 case AF9013_TUNER_MC44S803:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300990 ret = dvb_attach(mc44s803_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300991 &adap->dev->i2c_adap,
Jochen Friedrichd5633992009-02-02 14:59:50 -0300992 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300993 break;
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300994 case AF9013_TUNER_MXL5007T:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300995 ret = dvb_attach(mxl5007t_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300996 &adap->dev->i2c_adap,
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300997 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
998 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300999 case AF9013_TUNER_UNKNOWN:
1000 default:
1001 ret = -ENODEV;
1002 err("Unknown tuner id:%d",
Antti Palosaaria3645e52012-06-07 20:36:35 -03001003 state->af9013_config[adap->id].tuner);
Antti Palosaari80619de2008-09-15 17:18:09 -03001004 }
Gordon Heckerbe4a5e72012-03-14 10:27:30 -03001005
Antti Palosaaria3645e52012-06-07 20:36:35 -03001006 if (adap->fe[0]->ops.tuner_ops.init) {
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001007 state->tuner_init[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -03001008 adap->fe[0]->ops.tuner_ops.init;
1009 adap->fe[0]->ops.tuner_ops.init = af9015_tuner_init;
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001010 }
Gordon Heckerbe4a5e72012-03-14 10:27:30 -03001011
Antti Palosaaria3645e52012-06-07 20:36:35 -03001012 if (adap->fe[0]->ops.tuner_ops.sleep) {
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001013 state->tuner_sleep[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -03001014 adap->fe[0]->ops.tuner_ops.sleep;
1015 adap->fe[0]->ops.tuner_ops.sleep = af9015_tuner_sleep;
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001016 }
1017
Antti Palosaari80619de2008-09-15 17:18:09 -03001018 return ret;
1019}
1020
Antti Palosaaria3645e52012-06-07 20:36:35 -03001021static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
1022{
1023 int ret;
1024 deb_info("%s: onoff:%d\n", __func__, onoff);
1025
1026 if (onoff)
1027 ret = af9015_set_reg_bit(adap->dev, 0xd503, 0);
1028 else
1029 ret = af9015_clear_reg_bit(adap->dev, 0xd503, 0);
1030
1031 return ret;
1032}
1033
1034static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
1035 int onoff)
1036{
1037 int ret;
1038 u8 idx;
1039
1040 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
1041 __func__, index, pid, onoff);
1042
1043 ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
1044 if (ret)
1045 goto error;
1046
1047 ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
1048 if (ret)
1049 goto error;
1050
1051 idx = ((index & 0x1f) | (1 << 5));
1052 ret = af9015_write_reg(adap->dev, 0xd504, idx);
1053
1054error:
1055 return ret;
1056}
1057
1058static int af9015_init_endpoint(struct dvb_usb_device *d)
1059{
1060 struct af9015_state *state = d->priv;
1061 int ret;
1062 u16 frame_size;
1063 u8 packet_size;
1064 deb_info("%s: USB speed:%d\n", __func__, d->udev->speed);
1065
1066 if (d->udev->speed == USB_SPEED_FULL) {
1067 frame_size = TS_USB11_FRAME_SIZE/4;
1068 packet_size = TS_USB11_MAX_PACKET_SIZE/4;
1069 } else {
1070 frame_size = TS_USB20_FRAME_SIZE/4;
1071 packet_size = TS_USB20_MAX_PACKET_SIZE/4;
1072 }
1073
1074 ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
1075 if (ret)
1076 goto error;
1077 ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
1078 if (ret)
1079 goto error;
1080 ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
1081 if (ret)
1082 goto error;
1083 ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
1084 if (ret)
1085 goto error;
1086 ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
1087 if (ret)
1088 goto error;
1089 if (state->dual_mode) {
1090 ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
1091 if (ret)
1092 goto error;
1093 }
1094 ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
1095 if (ret)
1096 goto error;
1097 if (state->dual_mode) {
1098 ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
1099 if (ret)
1100 goto error;
1101 }
1102 /* EP4 xfer length */
1103 ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
1104 if (ret)
1105 goto error;
1106 ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
1107 if (ret)
1108 goto error;
1109 /* EP5 xfer length */
1110 ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
1111 if (ret)
1112 goto error;
1113 ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
1114 if (ret)
1115 goto error;
1116 ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
1117 if (ret)
1118 goto error;
1119 ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
1120 if (ret)
1121 goto error;
1122 ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
1123 if (ret)
1124 goto error;
1125 if (state->dual_mode) {
1126 ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
1127 if (ret)
1128 goto error;
1129 }
1130
1131 /* enable / disable mp2if2 */
1132 if (state->dual_mode)
1133 ret = af9015_set_reg_bit(d, 0xd50b, 0);
1134 else
1135 ret = af9015_clear_reg_bit(d, 0xd50b, 0);
1136
1137error:
1138 if (ret)
1139 err("endpoint init failed:%d", ret);
1140 return ret;
1141}
1142
1143static int af9015_init(struct dvb_usb_device *d)
1144{
1145 struct af9015_state *state = d->priv;
1146 int ret;
1147 deb_info("%s:\n", __func__);
1148
1149 mutex_init(&state->fe_mutex);
1150
1151 /* init RC canary */
1152 ret = af9015_write_reg(d, 0x98e9, 0xff);
1153 if (ret)
1154 goto error;
1155
1156 ret = af9015_init_endpoint(d);
1157 if (ret)
1158 goto error;
1159
1160error:
1161 return ret;
1162}
1163
1164struct af9015_rc_setup {
1165 unsigned int id;
1166 char *rc_codes;
Jonathan Niederd07b9012012-01-07 04:11:27 -03001167};
1168
Antti Palosaaria3645e52012-06-07 20:36:35 -03001169static char *af9015_rc_setup_match(unsigned int id,
1170 const struct af9015_rc_setup *table)
1171{
1172 for (; table->rc_codes; table++)
1173 if (table->id == id)
1174 return table->rc_codes;
1175 return NULL;
1176}
1177
1178static const struct af9015_rc_setup af9015_rc_setup_modparam[] = {
1179 { AF9015_REMOTE_A_LINK_DTU_M, RC_MAP_ALINK_DTU_M },
1180 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, RC_MAP_MSI_DIGIVOX_II },
1181 { AF9015_REMOTE_MYGICTV_U718, RC_MAP_TOTAL_MEDIA_IN_HAND },
1182 { AF9015_REMOTE_DIGITTRADE_DVB_T, RC_MAP_DIGITTRADE },
1183 { AF9015_REMOTE_AVERMEDIA_KS, RC_MAP_AVERMEDIA_RM_KS },
Jonathan Niederd07b9012012-01-07 04:11:27 -03001184 { }
Antti Palosaari80619de2008-09-15 17:18:09 -03001185};
Antti Palosaari80619de2008-09-15 17:18:09 -03001186
Antti Palosaaria3645e52012-06-07 20:36:35 -03001187static const struct af9015_rc_setup af9015_rc_setup_hashes[] = {
1188 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II },
1189 { 0xa3703d00, RC_MAP_ALINK_DTU_M },
1190 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND }, /* MYGICTV U718 */
1191 { 0x5d49e3db, RC_MAP_DIGITTRADE }, /* LC-Power LC-USB-DVBT */
1192 { }
1193};
Antti Palosaari80619de2008-09-15 17:18:09 -03001194
Antti Palosaaria3645e52012-06-07 20:36:35 -03001195static int af9015_rc_query(struct dvb_usb_device *d)
1196{
1197 struct af9015_state *state = d->priv;
1198 int ret;
1199 u8 buf[17];
Antti Palosaari80619de2008-09-15 17:18:09 -03001200
Antti Palosaaria3645e52012-06-07 20:36:35 -03001201 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001202
Antti Palosaaria3645e52012-06-07 20:36:35 -03001203 /* read registers needed to detect remote controller code */
1204 ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
1205 if (ret)
1206 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -03001207
Antti Palosaaria3645e52012-06-07 20:36:35 -03001208 /* If any of these are non-zero, assume invalid data */
1209 if (buf[1] || buf[2] || buf[3])
1210 return ret;
Antti Palosaari80619de2008-09-15 17:18:09 -03001211
Antti Palosaaria3645e52012-06-07 20:36:35 -03001212 /* Check for repeat of previous code */
1213 if ((state->rc_repeat != buf[6] || buf[0]) &&
1214 !memcmp(&buf[12], state->rc_last, 4)) {
1215 deb_rc("%s: key repeated\n", __func__);
1216 rc_keydown(d->rc_dev, state->rc_keycode, 0);
1217 state->rc_repeat = buf[6];
1218 return ret;
1219 }
1220
1221 /* Only process key if canary killed */
1222 if (buf[16] != 0xff && buf[0] != 0x01) {
1223 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
1224 buf[12], buf[13], buf[14], buf[15]);
1225
1226 /* Reset the canary */
1227 ret = af9015_write_reg(d, 0x98e9, 0xff);
1228 if (ret)
1229 goto error;
1230
1231 /* Remember this key */
1232 memcpy(state->rc_last, &buf[12], 4);
1233 if (buf[14] == (u8) ~buf[15]) {
1234 if (buf[12] == (u8) ~buf[13]) {
1235 /* NEC */
1236 state->rc_keycode = buf[12] << 8 | buf[14];
1237 } else {
1238 /* NEC extended*/
1239 state->rc_keycode = buf[12] << 16 |
1240 buf[13] << 8 | buf[14];
Antti Palosaari80619de2008-09-15 17:18:09 -03001241 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001242 } else {
1243 /* 32 bit NEC */
1244 state->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1245 buf[14] << 8 | buf[15];
Antti Palosaari80619de2008-09-15 17:18:09 -03001246 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001247 rc_keydown(d->rc_dev, state->rc_keycode, 0);
1248 } else {
1249 deb_rc("%s: no key press\n", __func__);
1250 /* Invalidate last keypress */
1251 /* Not really needed, but helps with debug */
1252 state->rc_last[2] = state->rc_last[3];
1253 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001254
Antti Palosaaria3645e52012-06-07 20:36:35 -03001255 state->rc_repeat = buf[6];
Antti Palosaari80619de2008-09-15 17:18:09 -03001256
Antti Palosaaria3645e52012-06-07 20:36:35 -03001257error:
1258 if (ret)
1259 err("%s: failed:%d", __func__, ret);
Antti Palosaari80619de2008-09-15 17:18:09 -03001260
Antti Palosaaria3645e52012-06-07 20:36:35 -03001261 return ret;
1262}
Antti Palosaari80619de2008-09-15 17:18:09 -03001263
Antti Palosaaria3645e52012-06-07 20:36:35 -03001264static int af9015_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
1265{
1266 struct af9015_state *state = d->priv;
1267 u16 vid = le16_to_cpu(d->udev->descriptor.idVendor);
Antti Palosaari80619de2008-09-15 17:18:09 -03001268
Antti Palosaaria3645e52012-06-07 20:36:35 -03001269 if (state->ir_mode == AF9015_IR_MODE_DISABLED)
1270 return 0;
Antti Palosaari80619de2008-09-15 17:18:09 -03001271
Antti Palosaaria3645e52012-06-07 20:36:35 -03001272 /* try to load remote based module param */
1273 rc->map_name = af9015_rc_setup_match(dvb_usb_af9015_remote,
1274 af9015_rc_setup_modparam);
Antti Palosaari80619de2008-09-15 17:18:09 -03001275
Antti Palosaaria3645e52012-06-07 20:36:35 -03001276 /* try to load remote based eeprom hash */
1277 if (!rc->map_name)
1278 rc->map_name = af9015_rc_setup_match(state->eeprom_sum,
1279 af9015_rc_setup_hashes);
Antti Palosaari80619de2008-09-15 17:18:09 -03001280
Antti Palosaaria3645e52012-06-07 20:36:35 -03001281 /* try to load remote based USB iManufacturer string */
1282 if (!rc->map_name && vid == USB_VID_AFATECH) {
1283 /* Check USB manufacturer and product strings and try
1284 to determine correct remote in case of chip vendor
1285 reference IDs are used.
1286 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
1287 char manufacturer[10];
1288 memset(manufacturer, 0, sizeof(manufacturer));
1289 usb_string(d->udev, d->udev->descriptor.iManufacturer,
1290 manufacturer, sizeof(manufacturer));
1291 if (!strcmp("MSI", manufacturer)) {
1292 /* iManufacturer 1 MSI
1293 iProduct 2 MSI K-VOX */
1294 rc->map_name = af9015_rc_setup_match(
1295 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
1296 af9015_rc_setup_modparam);
Antti Palosaari80619de2008-09-15 17:18:09 -03001297 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001298 }
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001299
Antti Palosaaria3645e52012-06-07 20:36:35 -03001300 rc->allowed_protos = RC_TYPE_NEC;
1301 rc->query = af9015_rc_query;
1302 rc->interval = 500;
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001303
Antti Palosaaria3645e52012-06-07 20:36:35 -03001304 return 0;
1305}
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001306
Antti Palosaaria3645e52012-06-07 20:36:35 -03001307/* interface 0 is used by DVB-T receiver and
1308 interface 1 is for remote controller (HID) */
1309static struct dvb_usb_device_properties af9015_props = {
1310 .driver_name = KBUILD_MODNAME,
1311 .owner = THIS_MODULE,
1312 .adapter_nr = adapter_nr,
1313 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001314
Antti Palosaaria3645e52012-06-07 20:36:35 -03001315 .generic_bulk_ctrl_endpoint = 0x02,
1316 .generic_bulk_ctrl_endpoint_response = 0x81,
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001317
Antti Palosaaria3645e52012-06-07 20:36:35 -03001318 .identify_state = af9015_identify_state,
1319 .firmware = "dvb-usb-af9015.fw",
1320 .download_firmware = af9015_download_firmware,
1321
Antti Palosaaria3645e52012-06-07 20:36:35 -03001322 .i2c_algo = &af9015_i2c_algo,
Antti Palosaari2d2b37c72012-06-12 01:05:20 -03001323 .read_config = af9015_read_config,
1324 .frontend_attach = af9015_af9013_frontend_attach,
1325 .tuner_attach = af9015_tuner_attach,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001326 .init = af9015_init,
1327 .get_rc_config = af9015_get_rc_config,
1328 .get_usb_stream_config = af9015_get_usb_stream_config,
1329
1330 .get_adapter_count = af9015_get_adapter_count,
1331 .adapter = {
1332 {
1333 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1334 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1335 .pid_filter_count = 32,
1336 .pid_filter = af9015_pid_filter,
1337 .pid_filter_ctrl = af9015_pid_filter_ctrl,
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001338 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001339 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001340};
Antti Palosaari80619de2008-09-15 17:18:09 -03001341
Antti Palosaaria3645e52012-06-07 20:36:35 -03001342static const struct usb_device_id af9015_id_table[] = {
1343 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015,
1344 &af9015_props, "Afatech AF9015 reference design", NULL) },
1345 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016,
1346 &af9015_props, "Afatech AF9015 reference design", NULL) },
1347 { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD,
1348 &af9015_props, "Leadtek WinFast DTV Dongle Gold", RC_MAP_LEADTEK_Y04G0051) },
1349 { DVB_USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E,
1350 &af9015_props, "Pinnacle PCTV 71e", NULL) },
1351 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U,
1352 &af9015_props, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL) },
1353 { DVB_USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TINYTWIN,
1354 &af9015_props, "DigitalNow TinyTwin", RC_MAP_AZUREWAVE_AD_TU700) },
1355 { DVB_USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_AZUREWAVE_AD_TU700,
1356 &af9015_props, "TwinHan AzureWave AD-TU700(704J)", RC_MAP_AZUREWAVE_AD_TU700) },
1357 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2,
1358 &af9015_props, "TerraTec Cinergy T USB XE", NULL) },
1359 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T,
1360 &af9015_props, "KWorld PlusTV Dual DVB-T PCI (DVB-T PC160-2T)", NULL) },
1361 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X,
1362 &af9015_props, "AVerMedia AVerTV DVB-T Volar X", RC_MAP_AVERMEDIA_M135A) },
1363 { DVB_USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380,
1364 &af9015_props, "Xtensions XD-380", NULL) },
1365 { DVB_USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO,
1366 &af9015_props, "MSI DIGIVOX Duo", RC_MAP_MSI_DIGIVOX_III) },
1367 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2,
1368 &af9015_props, "Fujitsu-Siemens Slim Mobile USB DVB-T", NULL) },
1369 { DVB_USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2,
1370 &af9015_props, "Telestar Starstick 2", NULL) },
1371 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309,
1372 &af9015_props, "AVerMedia A309", NULL) },
1373 { DVB_USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III,
1374 &af9015_props, "MSI Digi VOX mini III", RC_MAP_MSI_DIGIVOX_III) },
1375 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U,
1376 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1377 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2,
1378 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1379 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3,
1380 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1381 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT,
1382 &af9015_props, "TrekStor DVB-T USB Stick", RC_MAP_TREKSTOR) },
1383 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850,
1384 &af9015_props, "AverMedia AVerTV Volar Black HD (A850)", NULL) },
1385 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805,
1386 &af9015_props, "AverMedia AVerTV Volar GPS 805 (A805)", NULL) },
1387 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU,
1388 &af9015_props, "Conceptronic USB2.0 DVB-T CTVDIGRCU V3.0", NULL) },
1389 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810,
1390 &af9015_props, "KWorld Digial MC-810", NULL) },
1391 { DVB_USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03,
1392 &af9015_props, "Genius TVGo DVB-T03", NULL) },
1393 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2,
1394 &af9015_props, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL) },
1395 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T,
1396 &af9015_props, "KWorld PlusTV DVB-T PCI Pro Card (DVB-T PC160-T)", NULL) },
1397 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20,
1398 &af9015_props, "Sveon STV20 Tuner USB DVB-T HDTV", NULL) },
1399 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2,
1400 &af9015_props, "DigitalNow TinyTwin v2", RC_MAP_DIGITALNOW_TINYTWIN) },
1401 { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS,
1402 &af9015_props, "Leadtek WinFast DTV2000DS", RC_MAP_LEADTEK_Y04G0051) },
1403 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T,
1404 &af9015_props, "KWorld USB DVB-T Stick Mobile (UB383-T)", NULL) },
1405 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4,
1406 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1407 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M,
1408 &af9015_props, "AverMedia AVerTV Volar M (A815Mac)", NULL) },
1409 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_RC,
1410 &af9015_props, "TerraTec Cinergy T Stick RC", RC_MAP_TERRATEC_SLIM_2) },
1411 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
1412 &af9015_props, "TerraTec Cinergy T Stick Dual RC", RC_MAP_TERRATEC_SLIM) },
1413 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T,
1414 &af9015_props, "AverMedia AVerTV Red HD+ (A850T)", NULL) },
1415 { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3,
1416 &af9015_props, "DigitalNow TinyTwin v3", RC_MAP_DIGITALNOW_TINYTWIN) },
1417 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22,
1418 &af9015_props, "Sveon STV22 Dual USB DVB-T Tuner HDTV", RC_MAP_MSI_DIGIVOX_III) },
1419 { }
1420};
1421MODULE_DEVICE_TABLE(usb, af9015_id_table);
Antti Palosaari80619de2008-09-15 17:18:09 -03001422
Antti Palosaari80619de2008-09-15 17:18:09 -03001423/* usb specific object needed to register this driver with the usb subsystem */
1424static struct usb_driver af9015_usb_driver = {
Antti Palosaaria3645e52012-06-07 20:36:35 -03001425 .name = KBUILD_MODNAME,
Antti Palosaari2d2b37c72012-06-12 01:05:20 -03001426 .id_table = af9015_id_table,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001427 .probe = dvb_usbv2_probe,
1428 .disconnect = dvb_usbv2_disconnect,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001429 .no_dynamic_id = 1,
Antti Palosaari77f54512012-06-09 21:22:06 -03001430 .soft_unbind = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001431};
1432
Greg Kroah-Hartmanecb3b2b2011-11-18 09:46:12 -08001433module_usb_driver(af9015_usb_driver);
Antti Palosaari80619de2008-09-15 17:18:09 -03001434
1435MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
Antti Palosaaribc050e62012-05-08 06:04:24 -03001436MODULE_DESCRIPTION("Afatech AF9015 driver");
Antti Palosaari80619de2008-09-15 17:18:09 -03001437MODULE_LICENSE("GPL");