2 * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
6 * Thanks to Afatech who kindly provided information.
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.
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.
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.
26 static int dvb_usb_af9015_debug
;
27 module_param_named(debug
, dvb_usb_af9015_debug
, int, 0644);
28 MODULE_PARM_DESC(debug
, "set debugging level" DVB_USB_DEBUG_STATUS
);
29 static int dvb_usb_af9015_remote
;
30 module_param_named(remote
, dvb_usb_af9015_remote
, int, 0644);
31 MODULE_PARM_DESC(remote
, "select remote");
32 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr
);
34 static int af9015_ctrl_msg(struct dvb_usb_device
*d
, struct req_t
*req
)
37 #define REQ_HDR_LEN 8 /* send header size */
38 #define ACK_HDR_LEN 2 /* rece header size */
39 struct af9015_state
*state
= d_to_priv(d
);
45 buf
[1] = state
->seq
++;
46 buf
[2] = req
->i2c_addr
;
47 buf
[3] = req
->addr
>> 8;
48 buf
[4] = req
->addr
& 0xff;
50 buf
[6] = req
->addr_len
;
51 buf
[7] = req
->data_len
;
61 buf
[2] |= 0x01; /* set I2C direction */
63 buf
[0] = READ_WRITE_I2C
;
66 if (((req
->addr
& 0xff00) == 0xff00) ||
67 ((req
->addr
& 0xff00) == 0xae00))
68 buf
[0] = WRITE_VIRTUAL_MEMORY
;
69 case WRITE_VIRTUAL_MEMORY
:
71 case DOWNLOAD_FIRMWARE
:
75 err("unknown command:%d", req
->cmd
);
80 /* 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
);
88 /* write receives seq + status = 2 bytes
89 read receives seq + status + data = 2 + N bytes */
93 wlen
+= req
->data_len
;
94 memcpy(&buf
[REQ_HDR_LEN
], req
->data
, req
->data_len
);
96 rlen
+= req
->data_len
;
99 /* no ack for these packets */
100 if (req
->cmd
== DOWNLOAD_FIRMWARE
|| req
->cmd
== RECONNECT_USB
)
103 ret
= dvb_usbv2_generic_rw(d
, buf
, wlen
, buf
, rlen
);
108 if (rlen
&& buf
[1]) {
109 err("command failed:%d", buf
[1]);
114 /* read request, copy returned data to return buf */
116 memcpy(req
->data
, &buf
[ACK_HDR_LEN
], req
->data_len
);
121 static int af9015_write_regs(struct dvb_usb_device
*d
, u16 addr
, u8
*val
,
124 struct req_t req
= {WRITE_MEMORY
, AF9015_I2C_DEMOD
, addr
, 0, 0, len
,
126 return af9015_ctrl_msg(d
, &req
);
129 static int af9015_read_regs(struct dvb_usb_device
*d
, u16 addr
, u8
*val
, u8 len
)
131 struct req_t req
= {READ_MEMORY
, AF9015_I2C_DEMOD
, addr
, 0, 0, len
,
133 return af9015_ctrl_msg(d
, &req
);
136 static int af9015_write_reg(struct dvb_usb_device
*d
, u16 addr
, u8 val
)
138 return af9015_write_regs(d
, addr
, &val
, 1);
141 static int af9015_read_reg(struct dvb_usb_device
*d
, u16 addr
, u8
*val
)
143 return af9015_read_regs(d
, addr
, val
, 1);
146 static int af9015_write_reg_i2c(struct dvb_usb_device
*d
, u8 addr
, u16 reg
,
149 struct af9015_state
*state
= d_to_priv(d
);
150 struct req_t req
= {WRITE_I2C
, addr
, reg
, 1, 1, 1, &val
};
152 if (addr
== state
->af9013_config
[0].i2c_addr
||
153 addr
== state
->af9013_config
[1].i2c_addr
)
156 return af9015_ctrl_msg(d
, &req
);
159 static int af9015_read_reg_i2c(struct dvb_usb_device
*d
, u8 addr
, u16 reg
,
162 struct af9015_state
*state
= d_to_priv(d
);
163 struct req_t req
= {READ_I2C
, addr
, reg
, 0, 1, 1, val
};
165 if (addr
== state
->af9013_config
[0].i2c_addr
||
166 addr
== state
->af9013_config
[1].i2c_addr
)
169 return af9015_ctrl_msg(d
, &req
);
172 static int af9015_do_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
, u8 op
)
177 ret
= af9015_read_reg(d
, addr
, &val
);
191 return af9015_write_reg(d
, addr
, val
);
194 static int af9015_set_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
)
196 return af9015_do_reg_bit(d
, addr
, bit
, 1);
199 static int af9015_clear_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
)
201 return af9015_do_reg_bit(d
, addr
, bit
, 0);
204 static int af9015_i2c_xfer(struct i2c_adapter
*adap
, struct i2c_msg msg
[],
207 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
208 struct af9015_state
*state
= d_to_priv(d
);
211 u8
uninitialized_var(mbox
), addr_len
;
215 The bus lock is needed because there is two tuners both using same I2C-address.
216 Due to that the only way to select correct tuner is use demodulator I2C-gate.
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 |____________| |____________|
236 if (mutex_lock_interruptible(&d
->i2c_mutex
) < 0)
240 if (msg
[i
].addr
== state
->af9013_config
[0].i2c_addr
||
241 msg
[i
].addr
== state
->af9013_config
[1].i2c_addr
) {
242 addr
= msg
[i
].buf
[0] << 8;
243 addr
+= msg
[i
].buf
[1];
244 mbox
= msg
[i
].buf
[2];
247 addr
= msg
[i
].buf
[0];
249 /* mbox is don't care in that case */
252 if (num
> i
+ 1 && (msg
[i
+1].flags
& I2C_M_RD
)) {
253 if (msg
[i
].len
> 3 || msg
[i
+1].len
> 61) {
257 if (msg
[i
].addr
== state
->af9013_config
[0].i2c_addr
)
258 req
.cmd
= READ_MEMORY
;
261 req
.i2c_addr
= msg
[i
].addr
;
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
);
269 } else if (msg
[i
].flags
& I2C_M_RD
) {
270 if (msg
[i
].len
> 61) {
274 if (msg
[i
].addr
== state
->af9013_config
[0].i2c_addr
) {
279 req
.i2c_addr
= msg
[i
].addr
;
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
);
288 if (msg
[i
].len
> 21) {
292 if (msg
[i
].addr
== state
->af9013_config
[0].i2c_addr
)
293 req
.cmd
= WRITE_MEMORY
;
296 req
.i2c_addr
= msg
[i
].addr
;
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
);
312 mutex_unlock(&d
->i2c_mutex
);
317 static u32
af9015_i2c_func(struct i2c_adapter
*adapter
)
322 static struct i2c_algorithm af9015_i2c_algo
= {
323 .master_xfer
= af9015_i2c_xfer
,
324 .functionality
= af9015_i2c_func
,
327 static int af9015_identify_state(struct dvb_usb_device
*d
, const char **name
)
331 struct req_t req
= {GET_CONFIG
, 0, 0, 0, 0, 1, &reply
};
333 ret
= af9015_ctrl_msg(d
, &req
);
337 deb_info("%s: reply:%02x\n", __func__
, reply
);
346 static int af9015_download_firmware(struct dvb_usb_device
*d
,
347 const struct firmware
*fw
)
349 struct af9015_state
*state
= d_to_priv(d
);
350 int i
, len
, remaining
, ret
;
351 struct req_t req
= {DOWNLOAD_FIRMWARE
, 0, 0, 0, 0, 0, NULL
};
354 deb_info("%s:\n", __func__
);
357 for (i
= 0; i
< fw
->size
; i
++)
358 checksum
+= fw
->data
[i
];
360 state
->firmware_size
= fw
->size
;
361 state
->firmware_checksum
= checksum
;
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
) {
371 req
.data
= (u8
*) &fw
->data
[fw
->size
- remaining
];
372 req
.addr
= FW_ADDR
+ fw
->size
- remaining
;
374 ret
= af9015_ctrl_msg(d
, &req
);
376 err("firmware download failed:%d", ret
);
381 /* firmware loaded, request boot */
384 ret
= af9015_ctrl_msg(d
, &req
);
386 err("firmware boot failed:%d", ret
);
394 /* hash (and dump) eeprom */
395 static int af9015_eeprom_hash(struct dvb_usb_device
*d
)
397 struct af9015_state
*state
= d_to_priv(d
);
399 static const unsigned int eeprom_size
= 256;
402 struct req_t req
= {READ_I2C
, AF9015_I2C_EEPROM
, 0, 0, 1, 1, &val
};
404 eeprom
= kmalloc(eeprom_size
, GFP_KERNEL
);
408 for (reg
= 0; reg
< eeprom_size
; reg
++) {
410 ret
= af9015_ctrl_msg(d
, &req
);
417 if (dvb_usb_af9015_debug
& 0x01)
418 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET
, eeprom
,
421 BUG_ON(eeprom_size
% 4);
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
]);
429 deb_info("%s: eeprom sum=%.8x\n", __func__
, state
->eeprom_sum
);
437 static int af9015_read_config(struct dvb_usb_device
*d
)
439 struct af9015_state
*state
= d_to_priv(d
);
441 u8 val
, i
, offset
= 0;
442 struct req_t req
= {READ_I2C
, AF9015_I2C_EEPROM
, 0, 0, 1, 1, &val
};
444 deb_info("%s:\n", __func__
);
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
);
457 ret
= af9015_eeprom_hash(d
);
461 deb_info("%s: IR mode=%d\n", __func__
, val
);
462 state
->ir_mode
= val
;
464 /* TS mode - one or two receivers */
465 req
.addr
= AF9015_EEPROM_TS_MODE
;
466 ret
= af9015_ctrl_msg(d
, &req
);
470 state
->dual_mode
= val
;
471 deb_info("%s: TS mode=%d\n", __func__
, state
->dual_mode
);
473 /* disable 2nd adapter because we don't have PID-filters */
474 if (d
->udev
->speed
== USB_SPEED_FULL
)
475 state
->dual_mode
= 0;
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
);
484 state
->af9013_config
[1].i2c_addr
= val
;
487 for (i
= 0; i
< state
->dual_mode
+ 1; i
++) {
489 offset
= AF9015_EEPROM_OFFSET
;
491 req
.addr
= AF9015_EEPROM_XTAL_TYPE1
+ offset
;
492 ret
= af9015_ctrl_msg(d
, &req
);
497 state
->af9013_config
[i
].clock
= 28800000;
500 state
->af9013_config
[i
].clock
= 20480000;
503 state
->af9013_config
[i
].clock
= 28000000;
506 state
->af9013_config
[i
].clock
= 25000000;
509 deb_info("%s: [%d] xtal=%d set clock=%d\n", __func__
, i
,
510 val
, state
->af9013_config
[i
].clock
);
513 req
.addr
= AF9015_EEPROM_IF1H
+ offset
;
514 ret
= af9015_ctrl_msg(d
, &req
);
518 state
->af9013_config
[i
].if_frequency
= val
<< 8;
520 req
.addr
= AF9015_EEPROM_IF1L
+ offset
;
521 ret
= af9015_ctrl_msg(d
, &req
);
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
);
531 req
.addr
= AF9015_EEPROM_MT2060_IF1H
+ offset
;
532 ret
= af9015_ctrl_msg(d
, &req
);
535 state
->mt2060_if1
[i
] = val
<< 8;
536 req
.addr
= AF9015_EEPROM_MT2060_IF1L
+ offset
;
537 ret
= af9015_ctrl_msg(d
, &req
);
540 state
->mt2060_if1
[i
] += val
;
541 deb_info("%s: [%d] MT2060 IF1=%d\n", __func__
, i
,
542 state
->mt2060_if1
[i
]);
545 req
.addr
= AF9015_EEPROM_TUNER_ID1
+ offset
;
546 ret
= af9015_ctrl_msg(d
, &req
);
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;
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;
566 case AF9013_TUNER_MC44S803
:
567 state
->af9013_config
[i
].gpio
[1] = AF9013_GPIO_LO
;
568 state
->af9013_config
[i
].spec_inv
= 1;
571 warn("tuner id=%d not supported, please report!", val
);
575 state
->af9013_config
[i
].tuner
= val
;
576 deb_info("%s: [%d] tuner id=%d\n", __func__
, i
, val
);
581 err("eeprom read failed=%d", ret
);
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;
596 state
->af9013_config
[0].if_frequency
= 4570000;
602 static int af9015_get_stream_config(struct dvb_frontend
*fe
, u8
*ts_type
,
603 struct usb_data_stream_properties
*stream
)
605 deb_info("%s: adap=%d\n", __func__
, fe_to_adap(fe
)->id
);
607 if (fe_to_d(fe
)->udev
->speed
== USB_SPEED_FULL
)
608 stream
->u
.bulk
.buffersize
= TS_USB11_FRAME_SIZE
;
613 static int af9015_get_adapter_count(struct dvb_usb_device
*d
)
615 struct af9015_state
*state
= d_to_priv(d
);
616 return state
->dual_mode
+ 1;
619 /* override demod callbacks for resource locking */
620 static int af9015_af9013_set_frontend(struct dvb_frontend
*fe
)
623 struct af9015_state
*state
= fe_to_priv(fe
);
625 if (mutex_lock_interruptible(&state
->fe_mutex
))
628 ret
= state
->set_frontend
[fe_to_adap(fe
)->id
](fe
);
630 mutex_unlock(&state
->fe_mutex
);
635 /* override demod callbacks for resource locking */
636 static int af9015_af9013_read_status(struct dvb_frontend
*fe
,
640 struct af9015_state
*state
= fe_to_priv(fe
);
642 if (mutex_lock_interruptible(&state
->fe_mutex
))
645 ret
= state
->read_status
[fe_to_adap(fe
)->id
](fe
, status
);
647 mutex_unlock(&state
->fe_mutex
);
652 /* override demod callbacks for resource locking */
653 static int af9015_af9013_init(struct dvb_frontend
*fe
)
656 struct af9015_state
*state
= fe_to_priv(fe
);
658 if (mutex_lock_interruptible(&state
->fe_mutex
))
661 ret
= state
->init
[fe_to_adap(fe
)->id
](fe
);
663 mutex_unlock(&state
->fe_mutex
);
668 /* override demod callbacks for resource locking */
669 static int af9015_af9013_sleep(struct dvb_frontend
*fe
)
672 struct af9015_state
*state
= fe_to_priv(fe
);
674 if (mutex_lock_interruptible(&state
->fe_mutex
))
677 ret
= state
->sleep
[fe_to_adap(fe
)->id
](fe
);
679 mutex_unlock(&state
->fe_mutex
);
684 /* override tuner callbacks for resource locking */
685 static int af9015_tuner_init(struct dvb_frontend
*fe
)
688 struct af9015_state
*state
= fe_to_priv(fe
);
690 if (mutex_lock_interruptible(&state
->fe_mutex
))
693 ret
= state
->tuner_init
[fe_to_adap(fe
)->id
](fe
);
695 mutex_unlock(&state
->fe_mutex
);
700 /* override tuner callbacks for resource locking */
701 static int af9015_tuner_sleep(struct dvb_frontend
*fe
)
704 struct af9015_state
*state
= fe_to_priv(fe
);
706 if (mutex_lock_interruptible(&state
->fe_mutex
))
709 ret
= state
->tuner_sleep
[fe_to_adap(fe
)->id
](fe
);
711 mutex_unlock(&state
->fe_mutex
);
716 static int af9015_copy_firmware(struct dvb_usb_device
*d
)
718 struct af9015_state
*state
= d_to_priv(d
);
722 struct req_t req
= {COPY_FIRMWARE
, 0, 0x5100, 0, 0, sizeof(fw_params
),
724 deb_info("%s:\n", __func__
);
726 fw_params
[0] = state
->firmware_size
>> 8;
727 fw_params
[1] = state
->firmware_size
& 0xff;
728 fw_params
[2] = state
->firmware_checksum
>> 8;
729 fw_params
[3] = state
->firmware_checksum
& 0xff;
731 /* wait 2nd demodulator ready */
734 ret
= af9015_read_reg_i2c(d
, state
->af9013_config
[1].i2c_addr
,
739 deb_info("%s: firmware status:%02x\n", __func__
, val
);
741 if (val
== 0x0c) /* fw is running, no need for download */
744 /* set I2C master clock to fast (to speed up firmware copy) */
745 ret
= af9015_write_reg(d
, 0xd416, 0x04); /* 0x04 * 400ns */
752 ret
= af9015_ctrl_msg(d
, &req
);
754 err("firmware copy cmd failed:%d", ret
);
755 deb_info("%s: firmware copy done\n", __func__
);
757 /* set I2C master clock back to normal */
758 ret
= af9015_write_reg(d
, 0xd416, 0x14); /* 0x14 * 400ns */
762 /* request boot firmware */
763 ret
= af9015_write_reg_i2c(d
, state
->af9013_config
[1].i2c_addr
,
765 deb_info("%s: firmware boot cmd status:%d\n", __func__
, ret
);
769 for (i
= 0; i
< 15; i
++) {
772 /* check firmware status */
773 ret
= af9015_read_reg_i2c(d
, state
->af9013_config
[1].i2c_addr
,
775 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
780 if (val
== 0x0c || val
== 0x04) /* success or fail */
785 err("firmware did not run");
787 } else if (val
!= 0x0c) {
788 err("firmware boot timeout");
797 static int af9015_af9013_frontend_attach(struct dvb_usb_adapter
*adap
)
800 struct af9015_state
*state
= adap_to_priv(adap
);
803 state
->af9013_config
[0].ts_mode
= AF9013_TS_USB
;
804 memcpy(state
->af9013_config
[0].api_version
, "\x0\x1\x9\x0", 4);
805 state
->af9013_config
[0].gpio
[0] = AF9013_GPIO_HI
;
806 state
->af9013_config
[0].gpio
[3] = AF9013_GPIO_TUNER_ON
;
807 } else if (adap
->id
== 1) {
808 state
->af9013_config
[1].ts_mode
= AF9013_TS_SERIAL
;
809 memcpy(state
->af9013_config
[1].api_version
, "\x0\x1\x9\x0", 4);
810 state
->af9013_config
[1].gpio
[0] = AF9013_GPIO_TUNER_ON
;
811 state
->af9013_config
[1].gpio
[1] = AF9013_GPIO_LO
;
813 /* copy firmware to 2nd demodulator */
814 if (state
->dual_mode
) {
815 ret
= af9015_copy_firmware(adap_to_d(adap
));
817 err("firmware copy to 2nd frontend " \
818 "failed, will disable it");
819 state
->dual_mode
= 0;
827 /* attach demodulator */
828 adap
->fe
[0] = dvb_attach(af9013_attach
,
829 &state
->af9013_config
[adap
->id
], &adap_to_d(adap
)->i2c_adap
);
832 * AF9015 firmware does not like if it gets interrupted by I2C adapter
833 * request on some critical phases. During normal operation I2C adapter
834 * is used only 2nd demodulator and tuner on dual tuner devices.
835 * Override demodulator callbacks and use mutex for limit access to
836 * those "critical" paths to keep AF9015 happy.
839 state
->set_frontend
[adap
->id
] =
840 adap
->fe
[0]->ops
.set_frontend
;
841 adap
->fe
[0]->ops
.set_frontend
=
842 af9015_af9013_set_frontend
;
844 state
->read_status
[adap
->id
] =
845 adap
->fe
[0]->ops
.read_status
;
846 adap
->fe
[0]->ops
.read_status
=
847 af9015_af9013_read_status
;
849 state
->init
[adap
->id
] = adap
->fe
[0]->ops
.init
;
850 adap
->fe
[0]->ops
.init
= af9015_af9013_init
;
852 state
->sleep
[adap
->id
] = adap
->fe
[0]->ops
.sleep
;
853 adap
->fe
[0]->ops
.sleep
= af9015_af9013_sleep
;
856 return adap
->fe
[0] == NULL
? -ENODEV
: 0;
859 static struct mt2060_config af9015_mt2060_config
= {
864 static struct qt1010_config af9015_qt1010_config
= {
868 static struct tda18271_config af9015_tda18271_config
= {
869 .gate
= TDA18271_GATE_DIGITAL
,
870 .small_i2c
= TDA18271_16_BYTE_CHUNK_INIT
,
873 static struct mxl5005s_config af9015_mxl5003_config
= {
875 .if_freq
= IF_FREQ_4570000HZ
,
876 .xtal_freq
= CRYSTAL_FREQ_16000000HZ
,
877 .agc_mode
= MXL_SINGLE_AGC
,
878 .tracking_filter
= MXL_TF_DEFAULT
,
879 .rssi_enable
= MXL_RSSI_ENABLE
,
880 .cap_select
= MXL_CAP_SEL_ENABLE
,
881 .div_out
= MXL_DIV_OUT_4
,
882 .clock_out
= MXL_CLOCK_OUT_DISABLE
,
883 .output_load
= MXL5005S_IF_OUTPUT_LOAD_200_OHM
,
884 .top
= MXL5005S_TOP_25P2
,
885 .mod_mode
= MXL_DIGITAL_MODE
,
886 .if_mode
= MXL_ZERO_IF
,
887 .AgcMasterByte
= 0x00,
890 static struct mxl5005s_config af9015_mxl5005_config
= {
892 .if_freq
= IF_FREQ_4570000HZ
,
893 .xtal_freq
= CRYSTAL_FREQ_16000000HZ
,
894 .agc_mode
= MXL_SINGLE_AGC
,
895 .tracking_filter
= MXL_TF_OFF
,
896 .rssi_enable
= MXL_RSSI_ENABLE
,
897 .cap_select
= MXL_CAP_SEL_ENABLE
,
898 .div_out
= MXL_DIV_OUT_4
,
899 .clock_out
= MXL_CLOCK_OUT_DISABLE
,
900 .output_load
= MXL5005S_IF_OUTPUT_LOAD_200_OHM
,
901 .top
= MXL5005S_TOP_25P2
,
902 .mod_mode
= MXL_DIGITAL_MODE
,
903 .if_mode
= MXL_ZERO_IF
,
904 .AgcMasterByte
= 0x00,
907 static struct mc44s803_config af9015_mc44s803_config
= {
912 static struct tda18218_config af9015_tda18218_config
= {
914 .i2c_wr_max
= 21, /* max wr bytes AF9015 I2C adap can handle at once */
917 static struct mxl5007t_config af9015_mxl5007t_config
= {
918 .xtal_freq_hz
= MxL_XTAL_24_MHZ
,
919 .if_freq_hz
= MxL_IF_4_57_MHZ
,
922 static int af9015_tuner_attach(struct dvb_usb_adapter
*adap
)
924 struct af9015_state
*state
= adap_to_priv(adap
);
926 deb_info("%s:\n", __func__
);
928 switch (state
->af9013_config
[adap
->id
].tuner
) {
929 case AF9013_TUNER_MT2060
:
930 case AF9013_TUNER_MT2060_2
:
931 ret
= dvb_attach(mt2060_attach
, adap
->fe
[0],
932 &adap_to_d(adap
)->i2c_adap
, &af9015_mt2060_config
,
933 state
->mt2060_if1
[adap
->id
])
934 == NULL
? -ENODEV
: 0;
936 case AF9013_TUNER_QT1010
:
937 case AF9013_TUNER_QT1010A
:
938 ret
= dvb_attach(qt1010_attach
, adap
->fe
[0],
939 &adap_to_d(adap
)->i2c_adap
,
940 &af9015_qt1010_config
) == NULL
? -ENODEV
: 0;
942 case AF9013_TUNER_TDA18271
:
943 ret
= dvb_attach(tda18271_attach
, adap
->fe
[0], 0xc0,
944 &adap_to_d(adap
)->i2c_adap
,
945 &af9015_tda18271_config
) == NULL
? -ENODEV
: 0;
947 case AF9013_TUNER_TDA18218
:
948 ret
= dvb_attach(tda18218_attach
, adap
->fe
[0],
949 &adap_to_d(adap
)->i2c_adap
,
950 &af9015_tda18218_config
) == NULL
? -ENODEV
: 0;
952 case AF9013_TUNER_MXL5003D
:
953 ret
= dvb_attach(mxl5005s_attach
, adap
->fe
[0],
954 &adap_to_d(adap
)->i2c_adap
,
955 &af9015_mxl5003_config
) == NULL
? -ENODEV
: 0;
957 case AF9013_TUNER_MXL5005D
:
958 case AF9013_TUNER_MXL5005R
:
959 ret
= dvb_attach(mxl5005s_attach
, adap
->fe
[0],
960 &adap_to_d(adap
)->i2c_adap
,
961 &af9015_mxl5005_config
) == NULL
? -ENODEV
: 0;
963 case AF9013_TUNER_ENV77H11D5
:
964 ret
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], 0xc0,
965 &adap_to_d(adap
)->i2c_adap
,
966 DVB_PLL_TDA665X
) == NULL
? -ENODEV
: 0;
968 case AF9013_TUNER_MC44S803
:
969 ret
= dvb_attach(mc44s803_attach
, adap
->fe
[0],
970 &adap_to_d(adap
)->i2c_adap
,
971 &af9015_mc44s803_config
) == NULL
? -ENODEV
: 0;
973 case AF9013_TUNER_MXL5007T
:
974 ret
= dvb_attach(mxl5007t_attach
, adap
->fe
[0],
975 &adap_to_d(adap
)->i2c_adap
,
976 0xc0, &af9015_mxl5007t_config
) == NULL
? -ENODEV
: 0;
978 case AF9013_TUNER_UNKNOWN
:
981 err("Unknown tuner id:%d",
982 state
->af9013_config
[adap
->id
].tuner
);
985 if (adap
->fe
[0]->ops
.tuner_ops
.init
) {
986 state
->tuner_init
[adap
->id
] =
987 adap
->fe
[0]->ops
.tuner_ops
.init
;
988 adap
->fe
[0]->ops
.tuner_ops
.init
= af9015_tuner_init
;
991 if (adap
->fe
[0]->ops
.tuner_ops
.sleep
) {
992 state
->tuner_sleep
[adap
->id
] =
993 adap
->fe
[0]->ops
.tuner_ops
.sleep
;
994 adap
->fe
[0]->ops
.tuner_ops
.sleep
= af9015_tuner_sleep
;
1000 static int af9015_pid_filter_ctrl(struct dvb_usb_adapter
*adap
, int onoff
)
1003 deb_info("%s: onoff:%d\n", __func__
, onoff
);
1006 ret
= af9015_set_reg_bit(adap_to_d(adap
), 0xd503, 0);
1008 ret
= af9015_clear_reg_bit(adap_to_d(adap
), 0xd503, 0);
1013 static int af9015_pid_filter(struct dvb_usb_adapter
*adap
, int index
, u16 pid
,
1019 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
1020 __func__
, index
, pid
, onoff
);
1022 ret
= af9015_write_reg(adap_to_d(adap
), 0xd505, (pid
& 0xff));
1026 ret
= af9015_write_reg(adap_to_d(adap
), 0xd506, (pid
>> 8));
1030 idx
= ((index
& 0x1f) | (1 << 5));
1031 ret
= af9015_write_reg(adap_to_d(adap
), 0xd504, idx
);
1037 static int af9015_init_endpoint(struct dvb_usb_device
*d
)
1039 struct af9015_state
*state
= d_to_priv(d
);
1043 deb_info("%s: USB speed:%d\n", __func__
, d
->udev
->speed
);
1045 if (d
->udev
->speed
== USB_SPEED_FULL
) {
1046 frame_size
= TS_USB11_FRAME_SIZE
/4;
1047 packet_size
= TS_USB11_MAX_PACKET_SIZE
/4;
1049 frame_size
= TS_USB20_FRAME_SIZE
/4;
1050 packet_size
= TS_USB20_MAX_PACKET_SIZE
/4;
1053 ret
= af9015_set_reg_bit(d
, 0xd507, 2); /* assert EP4 reset */
1056 ret
= af9015_set_reg_bit(d
, 0xd50b, 1); /* assert EP5 reset */
1059 ret
= af9015_clear_reg_bit(d
, 0xdd11, 5); /* disable EP4 */
1062 ret
= af9015_clear_reg_bit(d
, 0xdd11, 6); /* disable EP5 */
1065 ret
= af9015_set_reg_bit(d
, 0xdd11, 5); /* enable EP4 */
1068 if (state
->dual_mode
) {
1069 ret
= af9015_set_reg_bit(d
, 0xdd11, 6); /* enable EP5 */
1073 ret
= af9015_clear_reg_bit(d
, 0xdd13, 5); /* disable EP4 NAK */
1076 if (state
->dual_mode
) {
1077 ret
= af9015_clear_reg_bit(d
, 0xdd13, 6); /* disable EP5 NAK */
1081 /* EP4 xfer length */
1082 ret
= af9015_write_reg(d
, 0xdd88, frame_size
& 0xff);
1085 ret
= af9015_write_reg(d
, 0xdd89, frame_size
>> 8);
1088 /* EP5 xfer length */
1089 ret
= af9015_write_reg(d
, 0xdd8a, frame_size
& 0xff);
1092 ret
= af9015_write_reg(d
, 0xdd8b, frame_size
>> 8);
1095 ret
= af9015_write_reg(d
, 0xdd0c, packet_size
); /* EP4 packet size */
1098 ret
= af9015_write_reg(d
, 0xdd0d, packet_size
); /* EP5 packet size */
1101 ret
= af9015_clear_reg_bit(d
, 0xd507, 2); /* negate EP4 reset */
1104 if (state
->dual_mode
) {
1105 ret
= af9015_clear_reg_bit(d
, 0xd50b, 1); /* negate EP5 reset */
1110 /* enable / disable mp2if2 */
1111 if (state
->dual_mode
)
1112 ret
= af9015_set_reg_bit(d
, 0xd50b, 0);
1114 ret
= af9015_clear_reg_bit(d
, 0xd50b, 0);
1118 err("endpoint init failed:%d", ret
);
1122 static int af9015_init(struct dvb_usb_device
*d
)
1124 struct af9015_state
*state
= d_to_priv(d
);
1126 deb_info("%s:\n", __func__
);
1128 mutex_init(&state
->fe_mutex
);
1130 /* init RC canary */
1131 ret
= af9015_write_reg(d
, 0x98e9, 0xff);
1135 ret
= af9015_init_endpoint(d
);
1143 struct af9015_rc_setup
{
1148 static char *af9015_rc_setup_match(unsigned int id
,
1149 const struct af9015_rc_setup
*table
)
1151 for (; table
->rc_codes
; table
++)
1152 if (table
->id
== id
)
1153 return table
->rc_codes
;
1157 static const struct af9015_rc_setup af9015_rc_setup_modparam
[] = {
1158 { AF9015_REMOTE_A_LINK_DTU_M
, RC_MAP_ALINK_DTU_M
},
1159 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3
, RC_MAP_MSI_DIGIVOX_II
},
1160 { AF9015_REMOTE_MYGICTV_U718
, RC_MAP_TOTAL_MEDIA_IN_HAND
},
1161 { AF9015_REMOTE_DIGITTRADE_DVB_T
, RC_MAP_DIGITTRADE
},
1162 { AF9015_REMOTE_AVERMEDIA_KS
, RC_MAP_AVERMEDIA_RM_KS
},
1166 static const struct af9015_rc_setup af9015_rc_setup_hashes
[] = {
1167 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II
},
1168 { 0xa3703d00, RC_MAP_ALINK_DTU_M
},
1169 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND
}, /* MYGICTV U718 */
1170 { 0x5d49e3db, RC_MAP_DIGITTRADE
}, /* LC-Power LC-USB-DVBT */
1174 static int af9015_rc_query(struct dvb_usb_device
*d
)
1176 struct af9015_state
*state
= d_to_priv(d
);
1180 deb_info("%s:\n", __func__
);
1182 /* read registers needed to detect remote controller code */
1183 ret
= af9015_read_regs(d
, 0x98d9, buf
, sizeof(buf
));
1187 /* If any of these are non-zero, assume invalid data */
1188 if (buf
[1] || buf
[2] || buf
[3])
1191 /* Check for repeat of previous code */
1192 if ((state
->rc_repeat
!= buf
[6] || buf
[0]) &&
1193 !memcmp(&buf
[12], state
->rc_last
, 4)) {
1194 deb_rc("%s: key repeated\n", __func__
);
1195 rc_keydown(d
->rc_dev
, state
->rc_keycode
, 0);
1196 state
->rc_repeat
= buf
[6];
1200 /* Only process key if canary killed */
1201 if (buf
[16] != 0xff && buf
[0] != 0x01) {
1202 deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__
,
1203 buf
[12], buf
[13], buf
[14], buf
[15]);
1205 /* Reset the canary */
1206 ret
= af9015_write_reg(d
, 0x98e9, 0xff);
1210 /* Remember this key */
1211 memcpy(state
->rc_last
, &buf
[12], 4);
1212 if (buf
[14] == (u8
) ~buf
[15]) {
1213 if (buf
[12] == (u8
) ~buf
[13]) {
1215 state
->rc_keycode
= buf
[12] << 8 | buf
[14];
1218 state
->rc_keycode
= buf
[12] << 16 |
1219 buf
[13] << 8 | buf
[14];
1223 state
->rc_keycode
= buf
[12] << 24 | buf
[13] << 16 |
1224 buf
[14] << 8 | buf
[15];
1226 rc_keydown(d
->rc_dev
, state
->rc_keycode
, 0);
1228 deb_rc("%s: no key press\n", __func__
);
1229 /* Invalidate last keypress */
1230 /* Not really needed, but helps with debug */
1231 state
->rc_last
[2] = state
->rc_last
[3];
1234 state
->rc_repeat
= buf
[6];
1238 err("%s: failed:%d", __func__
, ret
);
1243 static int af9015_get_rc_config(struct dvb_usb_device
*d
, struct dvb_usb_rc
*rc
)
1245 struct af9015_state
*state
= d_to_priv(d
);
1246 u16 vid
= le16_to_cpu(d
->udev
->descriptor
.idVendor
);
1248 if (state
->ir_mode
== AF9015_IR_MODE_DISABLED
)
1251 /* try to load remote based module param */
1252 rc
->map_name
= af9015_rc_setup_match(dvb_usb_af9015_remote
,
1253 af9015_rc_setup_modparam
);
1255 /* try to load remote based eeprom hash */
1257 rc
->map_name
= af9015_rc_setup_match(state
->eeprom_sum
,
1258 af9015_rc_setup_hashes
);
1260 /* try to load remote based USB iManufacturer string */
1261 if (!rc
->map_name
&& vid
== USB_VID_AFATECH
) {
1262 /* Check USB manufacturer and product strings and try
1263 to determine correct remote in case of chip vendor
1264 reference IDs are used.
1265 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
1266 char manufacturer
[10];
1267 memset(manufacturer
, 0, sizeof(manufacturer
));
1268 usb_string(d
->udev
, d
->udev
->descriptor
.iManufacturer
,
1269 manufacturer
, sizeof(manufacturer
));
1270 if (!strcmp("MSI", manufacturer
)) {
1271 /* iManufacturer 1 MSI
1272 iProduct 2 MSI K-VOX */
1273 rc
->map_name
= af9015_rc_setup_match(
1274 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3
,
1275 af9015_rc_setup_modparam
);
1279 /* load empty to enable rc */
1281 rc
->map_name
= RC_MAP_EMPTY
;
1283 rc
->allowed_protos
= RC_TYPE_NEC
;
1284 rc
->query
= af9015_rc_query
;
1290 /* interface 0 is used by DVB-T receiver and
1291 interface 1 is for remote controller (HID) */
1292 static struct dvb_usb_device_properties af9015_props
= {
1293 .driver_name
= KBUILD_MODNAME
,
1294 .owner
= THIS_MODULE
,
1295 .adapter_nr
= adapter_nr
,
1296 .size_of_priv
= sizeof(struct af9015_state
),
1298 .generic_bulk_ctrl_endpoint
= 0x02,
1299 .generic_bulk_ctrl_endpoint_response
= 0x81,
1301 .identify_state
= af9015_identify_state
,
1302 .firmware
= "dvb-usb-af9015.fw",
1303 .download_firmware
= af9015_download_firmware
,
1305 .i2c_algo
= &af9015_i2c_algo
,
1306 .read_config
= af9015_read_config
,
1307 .frontend_attach
= af9015_af9013_frontend_attach
,
1308 .tuner_attach
= af9015_tuner_attach
,
1309 .init
= af9015_init
,
1310 .get_rc_config
= af9015_get_rc_config
,
1311 .get_stream_config
= af9015_get_stream_config
,
1313 .get_adapter_count
= af9015_get_adapter_count
,
1316 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1317 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1318 .pid_filter_count
= 32,
1319 .pid_filter
= af9015_pid_filter
,
1320 .pid_filter_ctrl
= af9015_pid_filter_ctrl
,
1322 .stream
= DVB_USB_STREAM_BULK(0x84, 8, TS_USB20_FRAME_SIZE
),
1324 .stream
= DVB_USB_STREAM_BULK(0x85, 8, TS_USB20_FRAME_SIZE
),
1329 static const struct usb_device_id af9015_id_table
[] = {
1330 { DVB_USB_DEVICE(USB_VID_AFATECH
, USB_PID_AFATECH_AF9015_9015
,
1331 &af9015_props
, "Afatech AF9015 reference design", NULL
) },
1332 { DVB_USB_DEVICE(USB_VID_AFATECH
, USB_PID_AFATECH_AF9015_9016
,
1333 &af9015_props
, "Afatech AF9015 reference design", NULL
) },
1334 { DVB_USB_DEVICE(USB_VID_LEADTEK
, USB_PID_WINFAST_DTV_DONGLE_GOLD
,
1335 &af9015_props
, "Leadtek WinFast DTV Dongle Gold", RC_MAP_LEADTEK_Y04G0051
) },
1336 { DVB_USB_DEVICE(USB_VID_PINNACLE
, USB_PID_PINNACLE_PCTV71E
,
1337 &af9015_props
, "Pinnacle PCTV 71e", NULL
) },
1338 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_399U
,
1339 &af9015_props
, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL
) },
1340 { DVB_USB_DEVICE(USB_VID_VISIONPLUS
, USB_PID_TINYTWIN
,
1341 &af9015_props
, "DigitalNow TinyTwin", RC_MAP_AZUREWAVE_AD_TU700
) },
1342 { DVB_USB_DEVICE(USB_VID_VISIONPLUS
, USB_PID_AZUREWAVE_AD_TU700
,
1343 &af9015_props
, "TwinHan AzureWave AD-TU700(704J)", RC_MAP_AZUREWAVE_AD_TU700
) },
1344 { DVB_USB_DEVICE(USB_VID_TERRATEC
, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2
,
1345 &af9015_props
, "TerraTec Cinergy T USB XE", NULL
) },
1346 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_PC160_2T
,
1347 &af9015_props
, "KWorld PlusTV Dual DVB-T PCI (DVB-T PC160-2T)", NULL
) },
1348 { DVB_USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_VOLAR_X
,
1349 &af9015_props
, "AVerMedia AVerTV DVB-T Volar X", RC_MAP_AVERMEDIA_M135A
) },
1350 { DVB_USB_DEVICE(USB_VID_XTENSIONS
, USB_PID_XTENSIONS_XD_380
,
1351 &af9015_props
, "Xtensions XD-380", NULL
) },
1352 { DVB_USB_DEVICE(USB_VID_MSI_2
, USB_PID_MSI_DIGIVOX_DUO
,
1353 &af9015_props
, "MSI DIGIVOX Duo", RC_MAP_MSI_DIGIVOX_III
) },
1354 { DVB_USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_VOLAR_X_2
,
1355 &af9015_props
, "Fujitsu-Siemens Slim Mobile USB DVB-T", NULL
) },
1356 { DVB_USB_DEVICE(USB_VID_TELESTAR
, USB_PID_TELESTAR_STARSTICK_2
,
1357 &af9015_props
, "Telestar Starstick 2", NULL
) },
1358 { DVB_USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A309
,
1359 &af9015_props
, "AVerMedia A309", NULL
) },
1360 { DVB_USB_DEVICE(USB_VID_MSI_2
, USB_PID_MSI_DIGI_VOX_MINI_III
,
1361 &af9015_props
, "MSI Digi VOX mini III", RC_MAP_MSI_DIGIVOX_III
) },
1362 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U
,
1363 &af9015_props
, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL
) },
1364 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_2
,
1365 &af9015_props
, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL
) },
1366 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_3
,
1367 &af9015_props
, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL
) },
1368 { DVB_USB_DEVICE(USB_VID_AFATECH
, USB_PID_TREKSTOR_DVBT
,
1369 &af9015_props
, "TrekStor DVB-T USB Stick", RC_MAP_TREKSTOR
) },
1370 { DVB_USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A850
,
1371 &af9015_props
, "AverMedia AVerTV Volar Black HD (A850)", NULL
) },
1372 { DVB_USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A805
,
1373 &af9015_props
, "AverMedia AVerTV Volar GPS 805 (A805)", NULL
) },
1374 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_CONCEPTRONIC_CTVDIGRCU
,
1375 &af9015_props
, "Conceptronic USB2.0 DVB-T CTVDIGRCU V3.0", NULL
) },
1376 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_MC810
,
1377 &af9015_props
, "KWorld Digial MC-810", NULL
) },
1378 { DVB_USB_DEVICE(USB_VID_KYE
, USB_PID_GENIUS_TVGO_DVB_T03
,
1379 &af9015_props
, "Genius TVGo DVB-T03", NULL
) },
1380 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_399U_2
,
1381 &af9015_props
, "KWorld PlusTV Dual DVB-T Stick (DVB-T 399U)", NULL
) },
1382 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_PC160_T
,
1383 &af9015_props
, "KWorld PlusTV DVB-T PCI Pro Card (DVB-T PC160-T)", NULL
) },
1384 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_SVEON_STV20
,
1385 &af9015_props
, "Sveon STV20 Tuner USB DVB-T HDTV", NULL
) },
1386 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_TINYTWIN_2
,
1387 &af9015_props
, "DigitalNow TinyTwin v2", RC_MAP_DIGITALNOW_TINYTWIN
) },
1388 { DVB_USB_DEVICE(USB_VID_LEADTEK
, USB_PID_WINFAST_DTV2000DS
,
1389 &af9015_props
, "Leadtek WinFast DTV2000DS", RC_MAP_LEADTEK_Y04G0051
) },
1390 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_UB383_T
,
1391 &af9015_props
, "KWorld USB DVB-T Stick Mobile (UB383-T)", NULL
) },
1392 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_4
,
1393 &af9015_props
, "KWorld USB DVB-T TV Stick II (VS-DVB-T 395U)", NULL
) },
1394 { DVB_USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A815M
,
1395 &af9015_props
, "AverMedia AVerTV Volar M (A815Mac)", NULL
) },
1396 { DVB_USB_DEVICE(USB_VID_TERRATEC
, USB_PID_TERRATEC_CINERGY_T_STICK_RC
,
1397 &af9015_props
, "TerraTec Cinergy T Stick RC", RC_MAP_TERRATEC_SLIM_2
) },
1398 { DVB_USB_DEVICE(USB_VID_TERRATEC
, USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC
,
1399 &af9015_props
, "TerraTec Cinergy T Stick Dual RC", RC_MAP_TERRATEC_SLIM
) },
1400 { DVB_USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A850T
,
1401 &af9015_props
, "AverMedia AVerTV Red HD+ (A850T)", NULL
) },
1402 { DVB_USB_DEVICE(USB_VID_GTEK
, USB_PID_TINYTWIN_3
,
1403 &af9015_props
, "DigitalNow TinyTwin v3", RC_MAP_DIGITALNOW_TINYTWIN
) },
1404 { DVB_USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_SVEON_STV22
,
1405 &af9015_props
, "Sveon STV22 Dual USB DVB-T Tuner HDTV", RC_MAP_MSI_DIGIVOX_III
) },
1408 MODULE_DEVICE_TABLE(usb
, af9015_id_table
);
1410 /* usb specific object needed to register this driver with the usb subsystem */
1411 static struct usb_driver af9015_usb_driver
= {
1412 .name
= KBUILD_MODNAME
,
1413 .id_table
= af9015_id_table
,
1414 .probe
= dvb_usbv2_probe
,
1415 .disconnect
= dvb_usbv2_disconnect
,
1416 .suspend
= dvb_usbv2_suspend
,
1417 .resume
= dvb_usbv2_resume
,
1422 module_usb_driver(af9015_usb_driver
);
1424 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1425 MODULE_DESCRIPTION("Afatech AF9015 driver");
1426 MODULE_LICENSE("GPL");