blob: a429c24d8b305dfd98b861b2bf89e9fcd892e2f5 [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{
Antti Palosaari1a590012012-06-16 16:25:22 -0300605 struct dvb_usb_adapter *adap = fe->dvb->priv;
606 deb_info("%s: adap=%d\n", __func__, adap->id);
Antti Palosaaria3645e52012-06-07 20:36:35 -0300607
608 if (adap->dev->udev->speed == USB_SPEED_FULL)
609 stream->u.bulk.buffersize = TS_USB11_FRAME_SIZE;
610
611 return 0;
612}
613
614static int af9015_get_adapter_count(struct dvb_usb_device *d)
615{
616 struct af9015_state *state = d->priv;
617 return state->dual_mode + 1;
618}
619
620/* override demod callbacks for resource locking */
621static int af9015_af9013_set_frontend(struct dvb_frontend *fe)
622{
623 int ret;
624 struct dvb_usb_adapter *adap = fe->dvb->priv;
625 struct af9015_state *state = adap->dev->priv;
626
627 if (mutex_lock_interruptible(&state->fe_mutex))
628 return -EAGAIN;
629
630 ret = state->set_frontend[adap->id](fe);
631
632 mutex_unlock(&state->fe_mutex);
633
634 return ret;
635}
636
637/* override demod callbacks for resource locking */
638static int af9015_af9013_read_status(struct dvb_frontend *fe,
639 fe_status_t *status)
640{
641 int ret;
642 struct dvb_usb_adapter *adap = fe->dvb->priv;
643 struct af9015_state *state = adap->dev->priv;
644
645 if (mutex_lock_interruptible(&state->fe_mutex))
646 return -EAGAIN;
647
648 ret = state->read_status[adap->id](fe, status);
649
650 mutex_unlock(&state->fe_mutex);
651
652 return ret;
653}
654
655/* override demod callbacks for resource locking */
656static int af9015_af9013_init(struct dvb_frontend *fe)
657{
658 int ret;
659 struct dvb_usb_adapter *adap = fe->dvb->priv;
660 struct af9015_state *state = adap->dev->priv;
661
662 if (mutex_lock_interruptible(&state->fe_mutex))
663 return -EAGAIN;
664
665 ret = state->init[adap->id](fe);
666
667 mutex_unlock(&state->fe_mutex);
668
669 return ret;
670}
671
672/* override demod callbacks for resource locking */
673static int af9015_af9013_sleep(struct dvb_frontend *fe)
674{
675 int ret;
676 struct dvb_usb_adapter *adap = fe->dvb->priv;
677 struct af9015_state *state = adap->dev->priv;
678
679 if (mutex_lock_interruptible(&state->fe_mutex))
680 return -EAGAIN;
681
682 ret = state->sleep[adap->id](fe);
683
684 mutex_unlock(&state->fe_mutex);
685
686 return ret;
687}
688
689/* override tuner callbacks for resource locking */
690static int af9015_tuner_init(struct dvb_frontend *fe)
691{
692 int ret;
693 struct dvb_usb_adapter *adap = fe->dvb->priv;
694 struct af9015_state *state = adap->dev->priv;
695
696 if (mutex_lock_interruptible(&state->fe_mutex))
697 return -EAGAIN;
698
699 ret = state->tuner_init[adap->id](fe);
700
701 mutex_unlock(&state->fe_mutex);
702
703 return ret;
704}
705
706/* override tuner callbacks for resource locking */
707static int af9015_tuner_sleep(struct dvb_frontend *fe)
708{
709 int ret;
710 struct dvb_usb_adapter *adap = fe->dvb->priv;
711 struct af9015_state *state = adap->dev->priv;
712
713 if (mutex_lock_interruptible(&state->fe_mutex))
714 return -EAGAIN;
715
716 ret = state->tuner_sleep[adap->id](fe);
717
718 mutex_unlock(&state->fe_mutex);
719
Antti Palosaari80619de2008-09-15 17:18:09 -0300720 return ret;
721}
722
723static int af9015_copy_firmware(struct dvb_usb_device *d)
724{
Antti Palosaaria3645e52012-06-07 20:36:35 -0300725 struct af9015_state *state = d->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -0300726 int ret;
727 u8 fw_params[4];
728 u8 val, i;
729 struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
730 fw_params };
731 deb_info("%s:\n", __func__);
732
Antti Palosaaria3645e52012-06-07 20:36:35 -0300733 fw_params[0] = state->firmware_size >> 8;
734 fw_params[1] = state->firmware_size & 0xff;
735 fw_params[2] = state->firmware_checksum >> 8;
736 fw_params[3] = state->firmware_checksum & 0xff;
Antti Palosaari80619de2008-09-15 17:18:09 -0300737
738 /* wait 2nd demodulator ready */
739 msleep(100);
740
Antti Palosaaria3645e52012-06-07 20:36:35 -0300741 ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
742 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300743 if (ret)
744 goto error;
745 else
746 deb_info("%s: firmware status:%02x\n", __func__, val);
747
748 if (val == 0x0c) /* fw is running, no need for download */
749 goto exit;
750
751 /* set I2C master clock to fast (to speed up firmware copy) */
752 ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
753 if (ret)
754 goto error;
755
756 msleep(50);
757
758 /* copy firmware */
759 ret = af9015_ctrl_msg(d, &req);
760 if (ret)
761 err("firmware copy cmd failed:%d", ret);
762 deb_info("%s: firmware copy done\n", __func__);
763
764 /* set I2C master clock back to normal */
765 ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
766 if (ret)
767 goto error;
768
769 /* request boot firmware */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300770 ret = af9015_write_reg_i2c(d, state->af9013_config[1].i2c_addr,
771 0xe205, 1);
Antti Palosaari80619de2008-09-15 17:18:09 -0300772 deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
773 if (ret)
774 goto error;
775
776 for (i = 0; i < 15; i++) {
777 msleep(100);
778
779 /* check firmware status */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300780 ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
781 0x98be, &val);
Antti Palosaari80619de2008-09-15 17:18:09 -0300782 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
783 __func__, ret, val);
784 if (ret)
785 goto error;
786
787 if (val == 0x0c || val == 0x04) /* success or fail */
788 break;
789 }
790
791 if (val == 0x04) {
792 err("firmware did not run");
793 ret = -1;
794 } else if (val != 0x0c) {
795 err("firmware boot timeout");
796 ret = -1;
797 }
798
799error:
800exit:
801 return ret;
802}
803
Antti Palosaari80619de2008-09-15 17:18:09 -0300804static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
805{
806 int ret;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300807 struct af9015_state *state = adap->dev->priv;
Antti Palosaari80619de2008-09-15 17:18:09 -0300808
Antti Palosaaria3645e52012-06-07 20:36:35 -0300809 if (adap->id == 0) {
810 state->af9013_config[0].ts_mode = AF9013_TS_USB;
811 memcpy(state->af9013_config[0].api_version, "\x0\x1\x9\x0", 4);
812 state->af9013_config[0].gpio[0] = AF9013_GPIO_HI;
813 state->af9013_config[0].gpio[3] = AF9013_GPIO_TUNER_ON;
814 } else if (adap->id == 1) {
815 state->af9013_config[1].ts_mode = AF9013_TS_SERIAL;
816 memcpy(state->af9013_config[1].api_version, "\x0\x1\x9\x0", 4);
817 state->af9013_config[1].gpio[0] = AF9013_GPIO_TUNER_ON;
818 state->af9013_config[1].gpio[1] = AF9013_GPIO_LO;
819
Antti Palosaari80619de2008-09-15 17:18:09 -0300820 /* copy firmware to 2nd demodulator */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300821 if (state->dual_mode) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300822 ret = af9015_copy_firmware(adap->dev);
823 if (ret) {
824 err("firmware copy to 2nd frontend " \
825 "failed, will disable it");
Antti Palosaaria3645e52012-06-07 20:36:35 -0300826 state->dual_mode = 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300827 return -ENODEV;
828 }
829 } else {
830 return -ENODEV;
831 }
832 }
833
834 /* attach demodulator */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300835 adap->fe[0] = dvb_attach(af9013_attach,
836 &state->af9013_config[adap->id], &adap->dev->i2c_adap);
Antti Palosaari80619de2008-09-15 17:18:09 -0300837
Antti Palosaarie90ab842011-11-12 22:33:30 -0300838 /*
839 * AF9015 firmware does not like if it gets interrupted by I2C adapter
840 * request on some critical phases. During normal operation I2C adapter
841 * is used only 2nd demodulator and tuner on dual tuner devices.
842 * Override demodulator callbacks and use mutex for limit access to
843 * those "critical" paths to keep AF9015 happy.
Antti Palosaarie90ab842011-11-12 22:33:30 -0300844 */
Antti Palosaaria3645e52012-06-07 20:36:35 -0300845 if (adap->fe[0]) {
Antti Palosaarie90ab842011-11-12 22:33:30 -0300846 state->set_frontend[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -0300847 adap->fe[0]->ops.set_frontend;
848 adap->fe[0]->ops.set_frontend =
Antti Palosaarie90ab842011-11-12 22:33:30 -0300849 af9015_af9013_set_frontend;
850
851 state->read_status[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -0300852 adap->fe[0]->ops.read_status;
853 adap->fe[0]->ops.read_status =
Antti Palosaarie90ab842011-11-12 22:33:30 -0300854 af9015_af9013_read_status;
855
Antti Palosaaria3645e52012-06-07 20:36:35 -0300856 state->init[adap->id] = adap->fe[0]->ops.init;
857 adap->fe[0]->ops.init = af9015_af9013_init;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300858
Antti Palosaaria3645e52012-06-07 20:36:35 -0300859 state->sleep[adap->id] = adap->fe[0]->ops.sleep;
860 adap->fe[0]->ops.sleep = af9015_af9013_sleep;
Antti Palosaarie90ab842011-11-12 22:33:30 -0300861 }
862
Antti Palosaaria3645e52012-06-07 20:36:35 -0300863 return adap->fe[0] == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300864}
865
866static struct mt2060_config af9015_mt2060_config = {
867 .i2c_address = 0xc0,
868 .clock_out = 0,
869};
870
871static struct qt1010_config af9015_qt1010_config = {
872 .i2c_address = 0xc4,
873};
874
875static struct tda18271_config af9015_tda18271_config = {
876 .gate = TDA18271_GATE_DIGITAL,
Mauro Carvalho Chehab7655e592010-10-27 14:55:34 -0200877 .small_i2c = TDA18271_16_BYTE_CHUNK_INIT,
Antti Palosaari80619de2008-09-15 17:18:09 -0300878};
879
880static struct mxl5005s_config af9015_mxl5003_config = {
881 .i2c_address = 0xc6,
882 .if_freq = IF_FREQ_4570000HZ,
883 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
884 .agc_mode = MXL_SINGLE_AGC,
885 .tracking_filter = MXL_TF_DEFAULT,
Antti Palosaaria1310772008-09-22 13:59:25 -0300886 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -0300887 .cap_select = MXL_CAP_SEL_ENABLE,
888 .div_out = MXL_DIV_OUT_4,
889 .clock_out = MXL_CLOCK_OUT_DISABLE,
890 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
891 .top = MXL5005S_TOP_25P2,
892 .mod_mode = MXL_DIGITAL_MODE,
893 .if_mode = MXL_ZERO_IF,
894 .AgcMasterByte = 0x00,
895};
896
897static struct mxl5005s_config af9015_mxl5005_config = {
898 .i2c_address = 0xc6,
899 .if_freq = IF_FREQ_4570000HZ,
900 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
901 .agc_mode = MXL_SINGLE_AGC,
902 .tracking_filter = MXL_TF_OFF,
Antti Palosaaria1310772008-09-22 13:59:25 -0300903 .rssi_enable = MXL_RSSI_ENABLE,
Antti Palosaari80619de2008-09-15 17:18:09 -0300904 .cap_select = MXL_CAP_SEL_ENABLE,
905 .div_out = MXL_DIV_OUT_4,
906 .clock_out = MXL_CLOCK_OUT_DISABLE,
907 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
908 .top = MXL5005S_TOP_25P2,
909 .mod_mode = MXL_DIGITAL_MODE,
910 .if_mode = MXL_ZERO_IF,
911 .AgcMasterByte = 0x00,
912};
913
Jochen Friedrichd5633992009-02-02 14:59:50 -0300914static struct mc44s803_config af9015_mc44s803_config = {
915 .i2c_address = 0xc0,
916 .dig_out = 1,
917};
918
Antti Palosaariee3d4402010-08-13 03:51:26 -0300919static struct tda18218_config af9015_tda18218_config = {
920 .i2c_address = 0xc0,
921 .i2c_wr_max = 21, /* max wr bytes AF9015 I2C adap can handle at once */
922};
923
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300924static struct mxl5007t_config af9015_mxl5007t_config = {
925 .xtal_freq_hz = MxL_XTAL_24_MHZ,
926 .if_freq_hz = MxL_IF_4_57_MHZ,
927};
928
Antti Palosaari80619de2008-09-15 17:18:09 -0300929static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
930{
Gordon Heckerbe4a5e72012-03-14 10:27:30 -0300931 struct af9015_state *state = adap->dev->priv;
Antti Palosaaria3645e52012-06-07 20:36:35 -0300932 int ret;
Antti Palosaari9a3ecc72010-10-07 21:37:06 -0300933 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -0300934
Antti Palosaaria3645e52012-06-07 20:36:35 -0300935 switch (state->af9013_config[adap->id].tuner) {
Antti Palosaari80619de2008-09-15 17:18:09 -0300936 case AF9013_TUNER_MT2060:
937 case AF9013_TUNER_MT2060_2:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300938 ret = dvb_attach(mt2060_attach, adap->fe[0],
Antti Palosaaribc050e62012-05-08 06:04:24 -0300939 &adap->dev->i2c_adap, &af9015_mt2060_config,
Antti Palosaaria3645e52012-06-07 20:36:35 -0300940 state->mt2060_if1[adap->id])
Antti Palosaari80619de2008-09-15 17:18:09 -0300941 == NULL ? -ENODEV : 0;
942 break;
943 case AF9013_TUNER_QT1010:
944 case AF9013_TUNER_QT1010A:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300945 ret = dvb_attach(qt1010_attach, adap->fe[0],
Antti Palosaaribc050e62012-05-08 06:04:24 -0300946 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300947 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
948 break;
949 case AF9013_TUNER_TDA18271:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300950 ret = dvb_attach(tda18271_attach, adap->fe[0], 0xc0,
Antti Palosaari713d9b52011-06-18 10:24:53 -0300951 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300952 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
953 break;
Antti Palosaariee3d4402010-08-13 03:51:26 -0300954 case AF9013_TUNER_TDA18218:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300955 ret = dvb_attach(tda18218_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300956 &adap->dev->i2c_adap,
Antti Palosaariee3d4402010-08-13 03:51:26 -0300957 &af9015_tda18218_config) == NULL ? -ENODEV : 0;
958 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300959 case AF9013_TUNER_MXL5003D:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300960 ret = dvb_attach(mxl5005s_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300961 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300962 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
963 break;
964 case AF9013_TUNER_MXL5005D:
965 case AF9013_TUNER_MXL5005R:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300966 ret = dvb_attach(mxl5005s_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300967 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300968 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
969 break;
970 case AF9013_TUNER_ENV77H11D5:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300971 ret = dvb_attach(dvb_pll_attach, adap->fe[0], 0xc0,
Antti Palosaari713d9b52011-06-18 10:24:53 -0300972 &adap->dev->i2c_adap,
Antti Palosaari80619de2008-09-15 17:18:09 -0300973 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
974 break;
975 case AF9013_TUNER_MC44S803:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300976 ret = dvb_attach(mc44s803_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300977 &adap->dev->i2c_adap,
Jochen Friedrichd5633992009-02-02 14:59:50 -0300978 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
Antti Palosaari80619de2008-09-15 17:18:09 -0300979 break;
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300980 case AF9013_TUNER_MXL5007T:
Antti Palosaaria3645e52012-06-07 20:36:35 -0300981 ret = dvb_attach(mxl5007t_attach, adap->fe[0],
Antti Palosaari713d9b52011-06-18 10:24:53 -0300982 &adap->dev->i2c_adap,
Antti Palosaariab07fdd2010-09-09 14:59:10 -0300983 0xc0, &af9015_mxl5007t_config) == NULL ? -ENODEV : 0;
984 break;
Antti Palosaari80619de2008-09-15 17:18:09 -0300985 case AF9013_TUNER_UNKNOWN:
986 default:
987 ret = -ENODEV;
988 err("Unknown tuner id:%d",
Antti Palosaaria3645e52012-06-07 20:36:35 -0300989 state->af9013_config[adap->id].tuner);
Antti Palosaari80619de2008-09-15 17:18:09 -0300990 }
Gordon Heckerbe4a5e72012-03-14 10:27:30 -0300991
Antti Palosaaria3645e52012-06-07 20:36:35 -0300992 if (adap->fe[0]->ops.tuner_ops.init) {
Antti Palosaari6d535bd2012-03-14 10:27:31 -0300993 state->tuner_init[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -0300994 adap->fe[0]->ops.tuner_ops.init;
995 adap->fe[0]->ops.tuner_ops.init = af9015_tuner_init;
Antti Palosaari6d535bd2012-03-14 10:27:31 -0300996 }
Gordon Heckerbe4a5e72012-03-14 10:27:30 -0300997
Antti Palosaaria3645e52012-06-07 20:36:35 -0300998 if (adap->fe[0]->ops.tuner_ops.sleep) {
Antti Palosaari6d535bd2012-03-14 10:27:31 -0300999 state->tuner_sleep[adap->id] =
Antti Palosaaria3645e52012-06-07 20:36:35 -03001000 adap->fe[0]->ops.tuner_ops.sleep;
1001 adap->fe[0]->ops.tuner_ops.sleep = af9015_tuner_sleep;
Antti Palosaari6d535bd2012-03-14 10:27:31 -03001002 }
1003
Antti Palosaari80619de2008-09-15 17:18:09 -03001004 return ret;
1005}
1006
Antti Palosaaria3645e52012-06-07 20:36:35 -03001007static int af9015_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
1008{
1009 int ret;
1010 deb_info("%s: onoff:%d\n", __func__, onoff);
1011
1012 if (onoff)
1013 ret = af9015_set_reg_bit(adap->dev, 0xd503, 0);
1014 else
1015 ret = af9015_clear_reg_bit(adap->dev, 0xd503, 0);
1016
1017 return ret;
1018}
1019
1020static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
1021 int onoff)
1022{
1023 int ret;
1024 u8 idx;
1025
1026 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
1027 __func__, index, pid, onoff);
1028
1029 ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
1030 if (ret)
1031 goto error;
1032
1033 ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
1034 if (ret)
1035 goto error;
1036
1037 idx = ((index & 0x1f) | (1 << 5));
1038 ret = af9015_write_reg(adap->dev, 0xd504, idx);
1039
1040error:
1041 return ret;
1042}
1043
1044static int af9015_init_endpoint(struct dvb_usb_device *d)
1045{
1046 struct af9015_state *state = d->priv;
1047 int ret;
1048 u16 frame_size;
1049 u8 packet_size;
1050 deb_info("%s: USB speed:%d\n", __func__, d->udev->speed);
1051
1052 if (d->udev->speed == USB_SPEED_FULL) {
1053 frame_size = TS_USB11_FRAME_SIZE/4;
1054 packet_size = TS_USB11_MAX_PACKET_SIZE/4;
1055 } else {
1056 frame_size = TS_USB20_FRAME_SIZE/4;
1057 packet_size = TS_USB20_MAX_PACKET_SIZE/4;
1058 }
1059
1060 ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
1061 if (ret)
1062 goto error;
1063 ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
1064 if (ret)
1065 goto error;
1066 ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
1067 if (ret)
1068 goto error;
1069 ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
1070 if (ret)
1071 goto error;
1072 ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
1073 if (ret)
1074 goto error;
1075 if (state->dual_mode) {
1076 ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
1077 if (ret)
1078 goto error;
1079 }
1080 ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
1081 if (ret)
1082 goto error;
1083 if (state->dual_mode) {
1084 ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
1085 if (ret)
1086 goto error;
1087 }
1088 /* EP4 xfer length */
1089 ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
1090 if (ret)
1091 goto error;
1092 ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
1093 if (ret)
1094 goto error;
1095 /* EP5 xfer length */
1096 ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
1097 if (ret)
1098 goto error;
1099 ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
1100 if (ret)
1101 goto error;
1102 ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
1103 if (ret)
1104 goto error;
1105 ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
1106 if (ret)
1107 goto error;
1108 ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
1109 if (ret)
1110 goto error;
1111 if (state->dual_mode) {
1112 ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
1113 if (ret)
1114 goto error;
1115 }
1116
1117 /* enable / disable mp2if2 */
1118 if (state->dual_mode)
1119 ret = af9015_set_reg_bit(d, 0xd50b, 0);
1120 else
1121 ret = af9015_clear_reg_bit(d, 0xd50b, 0);
1122
1123error:
1124 if (ret)
1125 err("endpoint init failed:%d", ret);
1126 return ret;
1127}
1128
1129static int af9015_init(struct dvb_usb_device *d)
1130{
1131 struct af9015_state *state = d->priv;
1132 int ret;
1133 deb_info("%s:\n", __func__);
1134
1135 mutex_init(&state->fe_mutex);
1136
1137 /* init RC canary */
1138 ret = af9015_write_reg(d, 0x98e9, 0xff);
1139 if (ret)
1140 goto error;
1141
1142 ret = af9015_init_endpoint(d);
1143 if (ret)
1144 goto error;
1145
1146error:
1147 return ret;
1148}
1149
1150struct af9015_rc_setup {
1151 unsigned int id;
1152 char *rc_codes;
Jonathan Niederd07b9012012-01-07 04:11:27 -03001153};
1154
Antti Palosaaria3645e52012-06-07 20:36:35 -03001155static char *af9015_rc_setup_match(unsigned int id,
1156 const struct af9015_rc_setup *table)
1157{
1158 for (; table->rc_codes; table++)
1159 if (table->id == id)
1160 return table->rc_codes;
1161 return NULL;
1162}
1163
1164static const struct af9015_rc_setup af9015_rc_setup_modparam[] = {
1165 { AF9015_REMOTE_A_LINK_DTU_M, RC_MAP_ALINK_DTU_M },
1166 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, RC_MAP_MSI_DIGIVOX_II },
1167 { AF9015_REMOTE_MYGICTV_U718, RC_MAP_TOTAL_MEDIA_IN_HAND },
1168 { AF9015_REMOTE_DIGITTRADE_DVB_T, RC_MAP_DIGITTRADE },
1169 { AF9015_REMOTE_AVERMEDIA_KS, RC_MAP_AVERMEDIA_RM_KS },
Jonathan Niederd07b9012012-01-07 04:11:27 -03001170 { }
Antti Palosaari80619de2008-09-15 17:18:09 -03001171};
Antti Palosaari80619de2008-09-15 17:18:09 -03001172
Antti Palosaaria3645e52012-06-07 20:36:35 -03001173static const struct af9015_rc_setup af9015_rc_setup_hashes[] = {
1174 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II },
1175 { 0xa3703d00, RC_MAP_ALINK_DTU_M },
1176 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND }, /* MYGICTV U718 */
1177 { 0x5d49e3db, RC_MAP_DIGITTRADE }, /* LC-Power LC-USB-DVBT */
1178 { }
1179};
Antti Palosaari80619de2008-09-15 17:18:09 -03001180
Antti Palosaaria3645e52012-06-07 20:36:35 -03001181static int af9015_rc_query(struct dvb_usb_device *d)
1182{
1183 struct af9015_state *state = d->priv;
1184 int ret;
1185 u8 buf[17];
Antti Palosaari80619de2008-09-15 17:18:09 -03001186
Antti Palosaaria3645e52012-06-07 20:36:35 -03001187 deb_info("%s:\n", __func__);
Antti Palosaari80619de2008-09-15 17:18:09 -03001188
Antti Palosaaria3645e52012-06-07 20:36:35 -03001189 /* read registers needed to detect remote controller code */
1190 ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
1191 if (ret)
1192 goto error;
Antti Palosaari80619de2008-09-15 17:18:09 -03001193
Antti Palosaaria3645e52012-06-07 20:36:35 -03001194 /* If any of these are non-zero, assume invalid data */
1195 if (buf[1] || buf[2] || buf[3])
1196 return ret;
Antti Palosaari80619de2008-09-15 17:18:09 -03001197
Antti Palosaaria3645e52012-06-07 20:36:35 -03001198 /* Check for repeat of previous code */
1199 if ((state->rc_repeat != buf[6] || buf[0]) &&
1200 !memcmp(&buf[12], state->rc_last, 4)) {
1201 deb_rc("%s: key repeated\n", __func__);
1202 rc_keydown(d->rc_dev, state->rc_keycode, 0);
1203 state->rc_repeat = buf[6];
1204 return ret;
1205 }
1206
1207 /* Only process key if canary killed */
1208 if (buf[16] != 0xff && buf[0] != 0x01) {
1209 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
1210 buf[12], buf[13], buf[14], buf[15]);
1211
1212 /* Reset the canary */
1213 ret = af9015_write_reg(d, 0x98e9, 0xff);
1214 if (ret)
1215 goto error;
1216
1217 /* Remember this key */
1218 memcpy(state->rc_last, &buf[12], 4);
1219 if (buf[14] == (u8) ~buf[15]) {
1220 if (buf[12] == (u8) ~buf[13]) {
1221 /* NEC */
1222 state->rc_keycode = buf[12] << 8 | buf[14];
1223 } else {
1224 /* NEC extended*/
1225 state->rc_keycode = buf[12] << 16 |
1226 buf[13] << 8 | buf[14];
Antti Palosaari80619de2008-09-15 17:18:09 -03001227 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001228 } else {
1229 /* 32 bit NEC */
1230 state->rc_keycode = buf[12] << 24 | buf[13] << 16 |
1231 buf[14] << 8 | buf[15];
Antti Palosaari80619de2008-09-15 17:18:09 -03001232 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001233 rc_keydown(d->rc_dev, state->rc_keycode, 0);
1234 } else {
1235 deb_rc("%s: no key press\n", __func__);
1236 /* Invalidate last keypress */
1237 /* Not really needed, but helps with debug */
1238 state->rc_last[2] = state->rc_last[3];
1239 }
Antti Palosaari80619de2008-09-15 17:18:09 -03001240
Antti Palosaaria3645e52012-06-07 20:36:35 -03001241 state->rc_repeat = buf[6];
Antti Palosaari80619de2008-09-15 17:18:09 -03001242
Antti Palosaaria3645e52012-06-07 20:36:35 -03001243error:
1244 if (ret)
1245 err("%s: failed:%d", __func__, ret);
Antti Palosaari80619de2008-09-15 17:18:09 -03001246
Antti Palosaaria3645e52012-06-07 20:36:35 -03001247 return ret;
1248}
Antti Palosaari80619de2008-09-15 17:18:09 -03001249
Antti Palosaaria3645e52012-06-07 20:36:35 -03001250static int af9015_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
1251{
1252 struct af9015_state *state = d->priv;
1253 u16 vid = le16_to_cpu(d->udev->descriptor.idVendor);
Antti Palosaari80619de2008-09-15 17:18:09 -03001254
Antti Palosaaria3645e52012-06-07 20:36:35 -03001255 if (state->ir_mode == AF9015_IR_MODE_DISABLED)
1256 return 0;
Antti Palosaari80619de2008-09-15 17:18:09 -03001257
Antti Palosaaria3645e52012-06-07 20:36:35 -03001258 /* try to load remote based module param */
1259 rc->map_name = af9015_rc_setup_match(dvb_usb_af9015_remote,
1260 af9015_rc_setup_modparam);
Antti Palosaari80619de2008-09-15 17:18:09 -03001261
Antti Palosaaria3645e52012-06-07 20:36:35 -03001262 /* try to load remote based eeprom hash */
1263 if (!rc->map_name)
1264 rc->map_name = af9015_rc_setup_match(state->eeprom_sum,
1265 af9015_rc_setup_hashes);
Antti Palosaari80619de2008-09-15 17:18:09 -03001266
Antti Palosaaria3645e52012-06-07 20:36:35 -03001267 /* try to load remote based USB iManufacturer string */
1268 if (!rc->map_name && vid == USB_VID_AFATECH) {
1269 /* Check USB manufacturer and product strings and try
1270 to determine correct remote in case of chip vendor
1271 reference IDs are used.
1272 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
1273 char manufacturer[10];
1274 memset(manufacturer, 0, sizeof(manufacturer));
1275 usb_string(d->udev, d->udev->descriptor.iManufacturer,
1276 manufacturer, sizeof(manufacturer));
1277 if (!strcmp("MSI", manufacturer)) {
1278 /* iManufacturer 1 MSI
1279 iProduct 2 MSI K-VOX */
1280 rc->map_name = af9015_rc_setup_match(
1281 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
1282 af9015_rc_setup_modparam);
Antti Palosaari80619de2008-09-15 17:18:09 -03001283 }
Antti Palosaaria3645e52012-06-07 20:36:35 -03001284 }
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001285
Antti Palosaaria3645e52012-06-07 20:36:35 -03001286 rc->allowed_protos = RC_TYPE_NEC;
1287 rc->query = af9015_rc_query;
1288 rc->interval = 500;
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001289
Antti Palosaaria3645e52012-06-07 20:36:35 -03001290 return 0;
1291}
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001292
Antti Palosaaria3645e52012-06-07 20:36:35 -03001293/* interface 0 is used by DVB-T receiver and
1294 interface 1 is for remote controller (HID) */
1295static struct dvb_usb_device_properties af9015_props = {
1296 .driver_name = KBUILD_MODNAME,
1297 .owner = THIS_MODULE,
1298 .adapter_nr = adapter_nr,
1299 .size_of_priv = sizeof(struct af9015_state),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001300
Antti Palosaaria3645e52012-06-07 20:36:35 -03001301 .generic_bulk_ctrl_endpoint = 0x02,
1302 .generic_bulk_ctrl_endpoint_response = 0x81,
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001303
Antti Palosaaria3645e52012-06-07 20:36:35 -03001304 .identify_state = af9015_identify_state,
1305 .firmware = "dvb-usb-af9015.fw",
1306 .download_firmware = af9015_download_firmware,
1307
Antti Palosaaria3645e52012-06-07 20:36:35 -03001308 .i2c_algo = &af9015_i2c_algo,
Antti Palosaari2d2b37c72012-06-12 01:05:20 -03001309 .read_config = af9015_read_config,
1310 .frontend_attach = af9015_af9013_frontend_attach,
1311 .tuner_attach = af9015_tuner_attach,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001312 .init = af9015_init,
1313 .get_rc_config = af9015_get_rc_config,
1314 .get_usb_stream_config = af9015_get_usb_stream_config,
1315
1316 .get_adapter_count = af9015_get_adapter_count,
1317 .adapter = {
1318 {
1319 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1320 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1321 .pid_filter_count = 32,
1322 .pid_filter = af9015_pid_filter,
1323 .pid_filter_ctrl = af9015_pid_filter_ctrl,
Antti Palosaari1a590012012-06-16 16:25:22 -03001324
1325 .stream = DVB_USB_STREAM_BULK(0x84, 8, TS_USB20_FRAME_SIZE),
1326 }, {
1327 .stream = DVB_USB_STREAM_BULK(0x85, 8, TS_USB20_FRAME_SIZE),
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001328 },
Antti Palosaari85d7d7c2009-04-09 09:16:12 -03001329 },
Antti Palosaari80619de2008-09-15 17:18:09 -03001330};
Antti Palosaari80619de2008-09-15 17:18:09 -03001331
Antti Palosaaria3645e52012-06-07 20:36:35 -03001332static const struct usb_device_id af9015_id_table[] = {
1333 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015,
1334 &af9015_props, "Afatech AF9015 reference design", NULL) },
1335 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016,
1336 &af9015_props, "Afatech AF9015 reference design", NULL) },
1337 { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD,
1338 &af9015_props, "Leadtek WinFast DTV Dongle Gold", RC_MAP_LEADTEK_Y04G0051) },
1339 { DVB_USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E,
1340 &af9015_props, "Pinnacle PCTV 71e", NULL) },
1341 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U,
1342 &af9015_props, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL) },
1343 { DVB_USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_TINYTWIN,
1344 &af9015_props, "DigitalNow TinyTwin", RC_MAP_AZUREWAVE_AD_TU700) },
1345 { DVB_USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_AZUREWAVE_AD_TU700,
1346 &af9015_props, "TwinHan AzureWave AD-TU700(704J)", RC_MAP_AZUREWAVE_AD_TU700) },
1347 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2,
1348 &af9015_props, "TerraTec Cinergy T USB XE", NULL) },
1349 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T,
1350 &af9015_props, "KWorld PlusTV Dual DVB-T PCI (DVB-T PC160-2T)", NULL) },
1351 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X,
1352 &af9015_props, "AVerMedia AVerTV DVB-T Volar X", RC_MAP_AVERMEDIA_M135A) },
1353 { DVB_USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380,
1354 &af9015_props, "Xtensions XD-380", NULL) },
1355 { DVB_USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO,
1356 &af9015_props, "MSI DIGIVOX Duo", RC_MAP_MSI_DIGIVOX_III) },
1357 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2,
1358 &af9015_props, "Fujitsu-Siemens Slim Mobile USB DVB-T", NULL) },
1359 { DVB_USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2,
1360 &af9015_props, "Telestar Starstick 2", NULL) },
1361 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309,
1362 &af9015_props, "AVerMedia A309", NULL) },
1363 { DVB_USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III,
1364 &af9015_props, "MSI Digi VOX mini III", RC_MAP_MSI_DIGIVOX_III) },
1365 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U,
1366 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1367 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2,
1368 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1369 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3,
1370 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1371 { DVB_USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT,
1372 &af9015_props, "TrekStor DVB-T USB Stick", RC_MAP_TREKSTOR) },
1373 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850,
1374 &af9015_props, "AverMedia AVerTV Volar Black HD (A850)", NULL) },
1375 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805,
1376 &af9015_props, "AverMedia AVerTV Volar GPS 805 (A805)", NULL) },
1377 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU,
1378 &af9015_props, "Conceptronic USB2.0 DVB-T CTVDIGRCU V3.0", NULL) },
1379 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810,
1380 &af9015_props, "KWorld Digial MC-810", NULL) },
1381 { DVB_USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03,
1382 &af9015_props, "Genius TVGo DVB-T03", NULL) },
1383 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2,
1384 &af9015_props, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL) },
1385 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T,
1386 &af9015_props, "KWorld PlusTV DVB-T PCI Pro Card (DVB-T PC160-T)", NULL) },
1387 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20,
1388 &af9015_props, "Sveon STV20 Tuner USB DVB-T HDTV", NULL) },
1389 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TINYTWIN_2,
1390 &af9015_props, "DigitalNow TinyTwin v2", RC_MAP_DIGITALNOW_TINYTWIN) },
1391 { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS,
1392 &af9015_props, "Leadtek WinFast DTV2000DS", RC_MAP_LEADTEK_Y04G0051) },
1393 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB383_T,
1394 &af9015_props, "KWorld USB DVB-T Stick Mobile (UB383-T)", NULL) },
1395 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_4,
1396 &af9015_props, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL) },
1397 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A815M,
1398 &af9015_props, "AverMedia AVerTV Volar M (A815Mac)", NULL) },
1399 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_RC,
1400 &af9015_props, "TerraTec Cinergy T Stick RC", RC_MAP_TERRATEC_SLIM_2) },
1401 { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
1402 &af9015_props, "TerraTec Cinergy T Stick Dual RC", RC_MAP_TERRATEC_SLIM) },
1403 { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T,
1404 &af9015_props, "AverMedia AVerTV Red HD+ (A850T)", NULL) },
1405 { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_TINYTWIN_3,
1406 &af9015_props, "DigitalNow TinyTwin v3", RC_MAP_DIGITALNOW_TINYTWIN) },
1407 { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22,
1408 &af9015_props, "Sveon STV22 Dual USB DVB-T Tuner HDTV", RC_MAP_MSI_DIGIVOX_III) },
1409 { }
1410};
1411MODULE_DEVICE_TABLE(usb, af9015_id_table);
Antti Palosaari80619de2008-09-15 17:18:09 -03001412
Antti Palosaari80619de2008-09-15 17:18:09 -03001413/* usb specific object needed to register this driver with the usb subsystem */
1414static struct usb_driver af9015_usb_driver = {
Antti Palosaaria3645e52012-06-07 20:36:35 -03001415 .name = KBUILD_MODNAME,
Antti Palosaari2d2b37c72012-06-12 01:05:20 -03001416 .id_table = af9015_id_table,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001417 .probe = dvb_usbv2_probe,
1418 .disconnect = dvb_usbv2_disconnect,
Antti Palosaari53dc1942012-06-12 02:20:01 -03001419 .suspend = dvb_usbv2_suspend,
1420 .resume = dvb_usbv2_resume,
Antti Palosaaria3645e52012-06-07 20:36:35 -03001421 .no_dynamic_id = 1,
Antti Palosaari77f54512012-06-09 21:22:06 -03001422 .soft_unbind = 1,
Antti Palosaari80619de2008-09-15 17:18:09 -03001423};
1424
Greg Kroah-Hartmanecb3b2b2011-11-18 09:46:12 -08001425module_usb_driver(af9015_usb_driver);
Antti Palosaari80619de2008-09-15 17:18:09 -03001426
1427MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
Antti Palosaaribc050e62012-05-08 06:04:24 -03001428MODULE_DESCRIPTION("Afatech AF9015 driver");
Antti Palosaari80619de2008-09-15 17:18:09 -03001429MODULE_LICENSE("GPL");