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.
24 #include <linux/hash.h>
34 static int dvb_usb_af9015_debug
;
35 module_param_named(debug
, dvb_usb_af9015_debug
, int, 0644);
36 MODULE_PARM_DESC(debug
, "set debugging level" DVB_USB_DEBUG_STATUS
);
37 static int dvb_usb_af9015_remote
;
38 module_param_named(remote
, dvb_usb_af9015_remote
, int, 0644);
39 MODULE_PARM_DESC(remote
, "select remote");
40 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr
);
42 static DEFINE_MUTEX(af9015_usb_mutex
);
44 static struct af9015_config af9015_config
;
45 static struct dvb_usb_device_properties af9015_properties
[3];
46 static int af9015_properties_count
= ARRAY_SIZE(af9015_properties
);
48 static struct af9013_config af9015_af9013_config
[] = {
50 .demod_address
= AF9015_I2C_DEMOD
,
51 .output_mode
= AF9013_OUTPUT_MODE_USB
,
52 .api_version
= { 0, 1, 9, 0 },
53 .gpio
[0] = AF9013_GPIO_HI
,
54 .gpio
[3] = AF9013_GPIO_TUNER_ON
,
57 .output_mode
= AF9013_OUTPUT_MODE_SERIAL
,
58 .api_version
= { 0, 1, 9, 0 },
59 .gpio
[0] = AF9013_GPIO_TUNER_ON
,
60 .gpio
[1] = AF9013_GPIO_LO
,
64 static int af9015_rw_udev(struct usb_device
*udev
, struct req_t
*req
)
67 #define REQ_HDR_LEN 8 /* send header size */
68 #define ACK_HDR_LEN 2 /* rece header size */
72 u8 msg_len
= REQ_HDR_LEN
;
73 static u8 seq
; /* packet sequence number */
75 if (mutex_lock_interruptible(&af9015_usb_mutex
) < 0)
80 buf
[2] = req
->i2c_addr
;
81 buf
[3] = req
->addr
>> 8;
82 buf
[4] = req
->addr
& 0xff;
84 buf
[6] = req
->addr_len
;
85 buf
[7] = req
->data_len
;
96 buf
[2] |= 0x01; /* set I2C direction */
98 buf
[0] = READ_WRITE_I2C
;
101 if (((req
->addr
& 0xff00) == 0xff00) ||
102 ((req
->addr
& 0xff00) == 0xae00))
103 buf
[0] = WRITE_VIRTUAL_MEMORY
;
104 case WRITE_VIRTUAL_MEMORY
:
106 case DOWNLOAD_FIRMWARE
:
110 err("unknown command:%d", req
->cmd
);
115 /* buffer overflow check */
116 if ((write
&& (req
->data_len
> BUF_LEN
- REQ_HDR_LEN
)) ||
117 (!write
&& (req
->data_len
> BUF_LEN
- ACK_HDR_LEN
))) {
118 err("too much data; cmd:%d len:%d", req
->cmd
, req
->data_len
);
123 /* write requested */
125 memcpy(&buf
[REQ_HDR_LEN
], req
->data
, req
->data_len
);
126 msg_len
+= req
->data_len
;
130 debug_dump(buf
, msg_len
, deb_xfer
);
133 ret
= usb_bulk_msg(udev
, usb_sndbulkpipe(udev
, 0x02), buf
, msg_len
,
134 &act_len
, AF9015_USB_TIMEOUT
);
136 err("bulk message failed:%d (%d/%d)", ret
, msg_len
, act_len
);
138 if (act_len
!= msg_len
)
139 ret
= -1; /* all data is not send */
143 /* no ack for those packets */
144 if (req
->cmd
== DOWNLOAD_FIRMWARE
|| req
->cmd
== RECONNECT_USB
)
147 /* write receives seq + status = 2 bytes
148 read receives seq + status + data = 2 + N bytes */
149 msg_len
= ACK_HDR_LEN
;
151 msg_len
+= req
->data_len
;
153 ret
= usb_bulk_msg(udev
, usb_rcvbulkpipe(udev
, 0x81), buf
, msg_len
,
154 &act_len
, AF9015_USB_TIMEOUT
);
156 err("recv bulk message failed:%d", ret
);
162 debug_dump(buf
, act_len
, deb_xfer
);
164 /* remote controller query status is 1 if remote code is not received */
165 if (req
->cmd
== GET_IR_CODE
&& buf
[1] == 1) {
166 buf
[1] = 0; /* clear command "error" status */
167 memset(&buf
[2], 0, req
->data_len
);
168 buf
[3] = 1; /* no remote code received mark */
173 err("command failed:%d", buf
[1]);
178 /* read request, copy returned data to return buf */
180 memcpy(req
->data
, &buf
[ACK_HDR_LEN
], req
->data_len
);
184 mutex_unlock(&af9015_usb_mutex
);
189 static int af9015_ctrl_msg(struct dvb_usb_device
*d
, struct req_t
*req
)
191 return af9015_rw_udev(d
->udev
, req
);
194 static int af9015_write_regs(struct dvb_usb_device
*d
, u16 addr
, u8
*val
,
197 struct req_t req
= {WRITE_MEMORY
, AF9015_I2C_DEMOD
, addr
, 0, 0, len
,
199 return af9015_ctrl_msg(d
, &req
);
202 static int af9015_write_reg(struct dvb_usb_device
*d
, u16 addr
, u8 val
)
204 return af9015_write_regs(d
, addr
, &val
, 1);
207 static int af9015_read_reg(struct dvb_usb_device
*d
, u16 addr
, u8
*val
)
209 struct req_t req
= {READ_MEMORY
, AF9015_I2C_DEMOD
, addr
, 0, 0, 1, val
};
210 return af9015_ctrl_msg(d
, &req
);
213 static int af9015_write_reg_i2c(struct dvb_usb_device
*d
, u8 addr
, u16 reg
,
216 struct req_t req
= {WRITE_I2C
, addr
, reg
, 1, 1, 1, &val
};
218 if (addr
== af9015_af9013_config
[0].demod_address
||
219 addr
== af9015_af9013_config
[1].demod_address
)
222 return af9015_ctrl_msg(d
, &req
);
225 static int af9015_read_reg_i2c(struct dvb_usb_device
*d
, u8 addr
, u16 reg
,
228 struct req_t req
= {READ_I2C
, addr
, reg
, 0, 1, 1, val
};
230 if (addr
== af9015_af9013_config
[0].demod_address
||
231 addr
== af9015_af9013_config
[1].demod_address
)
234 return af9015_ctrl_msg(d
, &req
);
237 static int af9015_i2c_xfer(struct i2c_adapter
*adap
, struct i2c_msg msg
[],
240 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
246 /* TODO: implement bus lock
248 The bus lock is needed because there is two tuners both using same I2C-address.
249 Due to that the only way to select correct tuner is use demodulator I2C-gate.
251 ................................................
252 . AF9015 includes integrated AF9013 demodulator.
253 . ____________ ____________ . ____________
254 .| uC | | demod | . | tuner |
255 .|------------| |------------| . |------------|
256 .| AF9015 | | AF9013/5 | . | MXL5003 |
257 .| |--+----I2C-------|-----/ -----|-.-----I2C-------| |
258 .| | | | addr 0x38 | . | addr 0xc6 |
259 .|____________| | |____________| . |____________|
260 .................|..............................
261 | ____________ ____________
262 | | demod | | tuner |
263 | |------------| |------------|
264 | | AF9013 | | MXL5003 |
265 +----I2C-------|-----/ -----|-------I2C-------| |
266 | addr 0x3a | | addr 0xc6 |
267 |____________| |____________|
269 if (mutex_lock_interruptible(&d
->i2c_mutex
) < 0)
273 if (msg
[i
].addr
== af9015_af9013_config
[0].demod_address
||
274 msg
[i
].addr
== af9015_af9013_config
[1].demod_address
) {
275 addr
= msg
[i
].buf
[0] << 8;
276 addr
+= msg
[i
].buf
[1];
277 mbox
= msg
[i
].buf
[2];
280 addr
= msg
[i
].buf
[0];
285 if (num
> i
+ 1 && (msg
[i
+1].flags
& I2C_M_RD
)) {
287 af9015_af9013_config
[0].demod_address
)
288 req
.cmd
= READ_MEMORY
;
291 req
.i2c_addr
= msg
[i
].addr
;
294 req
.addr_len
= addr_len
;
295 req
.data_len
= msg
[i
+1].len
;
296 req
.data
= &msg
[i
+1].buf
[0];
297 ret
= af9015_ctrl_msg(d
, &req
);
299 } else if (msg
[i
].flags
& I2C_M_RD
) {
302 af9015_af9013_config
[0].demod_address
)
306 req
.i2c_addr
= msg
[i
].addr
;
309 req
.addr_len
= addr_len
;
310 req
.data_len
= msg
[i
].len
;
311 req
.data
= &msg
[i
].buf
[0];
312 ret
= af9015_ctrl_msg(d
, &req
);
316 af9015_af9013_config
[0].demod_address
)
317 req
.cmd
= WRITE_MEMORY
;
320 req
.i2c_addr
= msg
[i
].addr
;
323 req
.addr_len
= addr_len
;
324 req
.data_len
= msg
[i
].len
-addr_len
;
325 req
.data
= &msg
[i
].buf
[addr_len
];
326 ret
= af9015_ctrl_msg(d
, &req
);
336 mutex_unlock(&d
->i2c_mutex
);
341 static u32
af9015_i2c_func(struct i2c_adapter
*adapter
)
346 static struct i2c_algorithm af9015_i2c_algo
= {
347 .master_xfer
= af9015_i2c_xfer
,
348 .functionality
= af9015_i2c_func
,
351 static int af9015_do_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
, u8 op
)
356 ret
= af9015_read_reg(d
, addr
, &val
);
370 return af9015_write_reg(d
, addr
, val
);
373 static int af9015_set_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
)
375 return af9015_do_reg_bit(d
, addr
, bit
, 1);
378 static int af9015_clear_reg_bit(struct dvb_usb_device
*d
, u16 addr
, u8 bit
)
380 return af9015_do_reg_bit(d
, addr
, bit
, 0);
383 static int af9015_init_endpoint(struct dvb_usb_device
*d
)
388 deb_info("%s: USB speed:%d\n", __func__
, d
->udev
->speed
);
390 /* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0.
391 We use smaller - about 1/4 from the original, 5 and 87. */
392 #define TS_PACKET_SIZE 188
394 #define TS_USB20_PACKET_COUNT 87
395 #define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT)
397 #define TS_USB11_PACKET_COUNT 5
398 #define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT)
400 #define TS_USB20_MAX_PACKET_SIZE 512
401 #define TS_USB11_MAX_PACKET_SIZE 64
403 if (d
->udev
->speed
== USB_SPEED_FULL
) {
404 frame_size
= TS_USB11_FRAME_SIZE
/4;
405 packet_size
= TS_USB11_MAX_PACKET_SIZE
/4;
407 frame_size
= TS_USB20_FRAME_SIZE
/4;
408 packet_size
= TS_USB20_MAX_PACKET_SIZE
/4;
411 ret
= af9015_set_reg_bit(d
, 0xd507, 2); /* assert EP4 reset */
414 ret
= af9015_set_reg_bit(d
, 0xd50b, 1); /* assert EP5 reset */
417 ret
= af9015_clear_reg_bit(d
, 0xdd11, 5); /* disable EP4 */
420 ret
= af9015_clear_reg_bit(d
, 0xdd11, 6); /* disable EP5 */
423 ret
= af9015_set_reg_bit(d
, 0xdd11, 5); /* enable EP4 */
426 if (af9015_config
.dual_mode
) {
427 ret
= af9015_set_reg_bit(d
, 0xdd11, 6); /* enable EP5 */
431 ret
= af9015_clear_reg_bit(d
, 0xdd13, 5); /* disable EP4 NAK */
434 if (af9015_config
.dual_mode
) {
435 ret
= af9015_clear_reg_bit(d
, 0xdd13, 6); /* disable EP5 NAK */
439 /* EP4 xfer length */
440 ret
= af9015_write_reg(d
, 0xdd88, frame_size
& 0xff);
443 ret
= af9015_write_reg(d
, 0xdd89, frame_size
>> 8);
446 /* EP5 xfer length */
447 ret
= af9015_write_reg(d
, 0xdd8a, frame_size
& 0xff);
450 ret
= af9015_write_reg(d
, 0xdd8b, frame_size
>> 8);
453 ret
= af9015_write_reg(d
, 0xdd0c, packet_size
); /* EP4 packet size */
456 ret
= af9015_write_reg(d
, 0xdd0d, packet_size
); /* EP5 packet size */
459 ret
= af9015_clear_reg_bit(d
, 0xd507, 2); /* negate EP4 reset */
462 if (af9015_config
.dual_mode
) {
463 ret
= af9015_clear_reg_bit(d
, 0xd50b, 1); /* negate EP5 reset */
468 /* enable / disable mp2if2 */
469 if (af9015_config
.dual_mode
)
470 ret
= af9015_set_reg_bit(d
, 0xd50b, 0);
472 ret
= af9015_clear_reg_bit(d
, 0xd50b, 0);
475 err("endpoint init failed:%d", ret
);
479 static int af9015_copy_firmware(struct dvb_usb_device
*d
)
484 struct req_t req
= {COPY_FIRMWARE
, 0, 0x5100, 0, 0, sizeof(fw_params
),
486 deb_info("%s:\n", __func__
);
488 fw_params
[0] = af9015_config
.firmware_size
>> 8;
489 fw_params
[1] = af9015_config
.firmware_size
& 0xff;
490 fw_params
[2] = af9015_config
.firmware_checksum
>> 8;
491 fw_params
[3] = af9015_config
.firmware_checksum
& 0xff;
493 /* wait 2nd demodulator ready */
496 ret
= af9015_read_reg_i2c(d
, 0x3a, 0x98be, &val
);
500 deb_info("%s: firmware status:%02x\n", __func__
, val
);
502 if (val
== 0x0c) /* fw is running, no need for download */
505 /* set I2C master clock to fast (to speed up firmware copy) */
506 ret
= af9015_write_reg(d
, 0xd416, 0x04); /* 0x04 * 400ns */
513 ret
= af9015_ctrl_msg(d
, &req
);
515 err("firmware copy cmd failed:%d", ret
);
516 deb_info("%s: firmware copy done\n", __func__
);
518 /* set I2C master clock back to normal */
519 ret
= af9015_write_reg(d
, 0xd416, 0x14); /* 0x14 * 400ns */
523 /* request boot firmware */
524 ret
= af9015_write_reg_i2c(d
, af9015_af9013_config
[1].demod_address
,
526 deb_info("%s: firmware boot cmd status:%d\n", __func__
, ret
);
530 for (i
= 0; i
< 15; i
++) {
533 /* check firmware status */
534 ret
= af9015_read_reg_i2c(d
,
535 af9015_af9013_config
[1].demod_address
, 0x98be, &val
);
536 deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
541 if (val
== 0x0c || val
== 0x04) /* success or fail */
546 err("firmware did not run");
548 } else if (val
!= 0x0c) {
549 err("firmware boot timeout");
558 /* hash (and dump) eeprom */
559 static int af9015_eeprom_hash(struct usb_device
*udev
)
561 static const unsigned int eeprom_size
= 256;
565 struct req_t req
= {READ_I2C
, AF9015_I2C_EEPROM
, 0, 0, 1, 1, &val
};
567 eeprom
= kmalloc(eeprom_size
, GFP_KERNEL
);
571 for (reg
= 0; reg
< eeprom_size
; reg
++) {
573 ret
= af9015_rw_udev(udev
, &req
);
579 if (dvb_usb_af9015_debug
& 0x01)
580 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET
, eeprom
,
583 BUG_ON(eeprom_size
% 4);
585 af9015_config
.eeprom_sum
= 0;
586 for (reg
= 0; reg
< eeprom_size
/ sizeof(u32
); reg
++) {
587 af9015_config
.eeprom_sum
*= GOLDEN_RATIO_PRIME_32
;
588 af9015_config
.eeprom_sum
+= le32_to_cpu(((u32
*)eeprom
)[reg
]);
591 deb_info("%s: eeprom sum=%.8x\n", __func__
, af9015_config
.eeprom_sum
);
599 static int af9015_download_ir_table(struct dvb_usb_device
*d
)
601 int i
, packets
= 0, ret
;
602 u16 addr
= 0x9a56; /* ir-table start address */
603 struct req_t req
= {WRITE_MEMORY
, 0, 0, 0, 0, 1, NULL
};
605 deb_info("%s:\n", __func__
);
607 data
= af9015_config
.ir_table
;
608 packets
= af9015_config
.ir_table_size
;
614 /* load remote ir-table */
615 for (i
= 0; i
< packets
; i
++) {
618 ret
= af9015_ctrl_msg(d
, &req
);
620 err("ir-table download failed at packet %d with " \
630 static int af9015_init(struct dvb_usb_device
*d
)
633 deb_info("%s:\n", __func__
);
635 ret
= af9015_init_endpoint(d
);
639 ret
= af9015_download_ir_table(d
);
647 static int af9015_pid_filter_ctrl(struct dvb_usb_adapter
*adap
, int onoff
)
650 deb_info("%s: onoff:%d\n", __func__
, onoff
);
653 ret
= af9015_set_reg_bit(adap
->dev
, 0xd503, 0);
655 ret
= af9015_clear_reg_bit(adap
->dev
, 0xd503, 0);
660 static int af9015_pid_filter(struct dvb_usb_adapter
*adap
, int index
, u16 pid
,
666 deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
667 __func__
, index
, pid
, onoff
);
669 ret
= af9015_write_reg(adap
->dev
, 0xd505, (pid
& 0xff));
673 ret
= af9015_write_reg(adap
->dev
, 0xd506, (pid
>> 8));
677 idx
= ((index
& 0x1f) | (1 << 5));
678 ret
= af9015_write_reg(adap
->dev
, 0xd504, idx
);
684 static int af9015_download_firmware(struct usb_device
*udev
,
685 const struct firmware
*fw
)
687 int i
, len
, packets
, remainder
, ret
;
688 struct req_t req
= {DOWNLOAD_FIRMWARE
, 0, 0, 0, 0, 0, NULL
};
689 u16 addr
= 0x5100; /* firmware start address */
692 deb_info("%s:\n", __func__
);
695 for (i
= 0; i
< fw
->size
; i
++)
696 checksum
+= fw
->data
[i
];
698 af9015_config
.firmware_size
= fw
->size
;
699 af9015_config
.firmware_checksum
= checksum
;
701 #define FW_PACKET_MAX_DATA 55
703 packets
= fw
->size
/ FW_PACKET_MAX_DATA
;
704 remainder
= fw
->size
% FW_PACKET_MAX_DATA
;
705 len
= FW_PACKET_MAX_DATA
;
706 for (i
= 0; i
<= packets
; i
++) {
707 if (i
== packets
) /* set size of the last packet */
711 req
.data
= (u8
*)(fw
->data
+ i
* FW_PACKET_MAX_DATA
);
713 addr
+= FW_PACKET_MAX_DATA
;
715 ret
= af9015_rw_udev(udev
, &req
);
717 err("firmware download failed at packet %d with " \
723 /* firmware loaded, request boot */
725 ret
= af9015_rw_udev(udev
, &req
);
727 err("firmware boot failed:%d", ret
);
735 struct af9015_setup
{
737 struct dvb_usb_rc_key
*rc_key_map
;
738 unsigned int rc_key_map_size
;
740 unsigned int ir_table_size
;
743 static const struct af9015_setup
*af9015_setup_match(unsigned int id
,
744 const struct af9015_setup
*table
)
746 for (; table
->rc_key_map
; table
++)
752 static const struct af9015_setup af9015_setup_modparam
[] = {
753 { AF9015_REMOTE_A_LINK_DTU_M
,
754 af9015_rc_keys_a_link
, ARRAY_SIZE(af9015_rc_keys_a_link
),
755 af9015_ir_table_a_link
, ARRAY_SIZE(af9015_ir_table_a_link
) },
756 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3
,
757 af9015_rc_keys_msi
, ARRAY_SIZE(af9015_rc_keys_msi
),
758 af9015_ir_table_msi
, ARRAY_SIZE(af9015_ir_table_msi
) },
759 { AF9015_REMOTE_MYGICTV_U718
,
760 af9015_rc_keys_mygictv
, ARRAY_SIZE(af9015_rc_keys_mygictv
),
761 af9015_ir_table_mygictv
, ARRAY_SIZE(af9015_ir_table_mygictv
) },
762 { AF9015_REMOTE_DIGITTRADE_DVB_T
,
763 af9015_rc_keys_digittrade
, ARRAY_SIZE(af9015_rc_keys_digittrade
),
764 af9015_ir_table_digittrade
, ARRAY_SIZE(af9015_ir_table_digittrade
) },
765 { AF9015_REMOTE_AVERMEDIA_KS
,
766 af9015_rc_keys_avermedia
, ARRAY_SIZE(af9015_rc_keys_avermedia
),
767 af9015_ir_table_avermedia_ks
, ARRAY_SIZE(af9015_ir_table_avermedia_ks
) },
771 /* don't add new entries here anymore, use hashes instead */
772 static const struct af9015_setup af9015_setup_usbids
[] = {
774 af9015_rc_keys_leadtek
, ARRAY_SIZE(af9015_rc_keys_leadtek
),
775 af9015_ir_table_leadtek
, ARRAY_SIZE(af9015_ir_table_leadtek
) },
776 { USB_VID_VISIONPLUS
,
777 af9015_rc_keys_twinhan
, ARRAY_SIZE(af9015_rc_keys_twinhan
),
778 af9015_ir_table_twinhan
, ARRAY_SIZE(af9015_ir_table_twinhan
) },
779 { USB_VID_KWORLD_2
, /* TODO: use correct rc keys */
780 af9015_rc_keys_twinhan
, ARRAY_SIZE(af9015_rc_keys_twinhan
),
781 af9015_ir_table_kworld
, ARRAY_SIZE(af9015_ir_table_kworld
) },
783 af9015_rc_keys_avermedia
, ARRAY_SIZE(af9015_rc_keys_avermedia
),
784 af9015_ir_table_avermedia
, ARRAY_SIZE(af9015_ir_table_avermedia
) },
786 af9015_rc_keys_msi_digivox_iii
, ARRAY_SIZE(af9015_rc_keys_msi_digivox_iii
),
787 af9015_ir_table_msi_digivox_iii
, ARRAY_SIZE(af9015_ir_table_msi_digivox_iii
) },
791 static const struct af9015_setup af9015_setup_hashes
[] = {
793 af9015_rc_keys_msi
, ARRAY_SIZE(af9015_rc_keys_msi
),
794 af9015_ir_table_msi
, ARRAY_SIZE(af9015_ir_table_msi
) },
796 af9015_rc_keys_a_link
, ARRAY_SIZE(af9015_rc_keys_a_link
),
797 af9015_ir_table_a_link
, ARRAY_SIZE(af9015_ir_table_a_link
) },
799 af9015_rc_keys_mygictv
, ARRAY_SIZE(af9015_rc_keys_mygictv
),
800 af9015_ir_table_mygictv
, ARRAY_SIZE(af9015_ir_table_mygictv
) },
804 static void af9015_set_remote_config(struct usb_device
*udev
,
805 struct dvb_usb_device_properties
*props
)
807 const struct af9015_setup
*table
= NULL
;
809 if (dvb_usb_af9015_remote
) {
810 /* load remote defined as module param */
811 table
= af9015_setup_match(dvb_usb_af9015_remote
,
812 af9015_setup_modparam
);
814 u16 vendor
= le16_to_cpu(udev
->descriptor
.idVendor
);
816 table
= af9015_setup_match(af9015_config
.eeprom_sum
,
817 af9015_setup_hashes
);
819 if (!table
&& vendor
== USB_VID_AFATECH
) {
820 /* Check USB manufacturer and product strings and try
821 to determine correct remote in case of chip vendor
822 reference IDs are used.
823 DO NOT ADD ANYTHING NEW HERE. Use hashes instead.
825 char manufacturer
[10];
826 memset(manufacturer
, 0, sizeof(manufacturer
));
827 usb_string(udev
, udev
->descriptor
.iManufacturer
,
828 manufacturer
, sizeof(manufacturer
));
829 if (!strcmp("MSI", manufacturer
)) {
830 /* iManufacturer 1 MSI
831 iProduct 2 MSI K-VOX */
832 table
= af9015_setup_match(
833 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3
,
834 af9015_setup_modparam
);
835 } else if (udev
->descriptor
.idProduct
==
836 cpu_to_le16(USB_PID_TREKSTOR_DVBT
)) {
837 table
= &(const struct af9015_setup
){ 0,
838 af9015_rc_keys_trekstor
,
839 ARRAY_SIZE(af9015_rc_keys_trekstor
),
840 af9015_ir_table_trekstor
,
841 ARRAY_SIZE(af9015_ir_table_trekstor
)
845 table
= af9015_setup_match(vendor
, af9015_setup_usbids
);
849 props
->rc_key_map
= table
->rc_key_map
;
850 props
->rc_key_map_size
= table
->rc_key_map_size
;
851 af9015_config
.ir_table
= table
->ir_table
;
852 af9015_config
.ir_table_size
= table
->ir_table_size
;
856 static int af9015_read_config(struct usb_device
*udev
)
859 u8 val
, i
, offset
= 0;
860 struct req_t req
= {READ_I2C
, AF9015_I2C_EEPROM
, 0, 0, 1, 1, &val
};
862 /* IR remote controller */
863 req
.addr
= AF9015_EEPROM_IR_MODE
;
864 /* first message will timeout often due to possible hw bug */
865 for (i
= 0; i
< 4; i
++) {
866 ret
= af9015_rw_udev(udev
, &req
);
873 ret
= af9015_eeprom_hash(udev
);
877 deb_info("%s: IR mode:%d\n", __func__
, val
);
878 for (i
= 0; i
< af9015_properties_count
; i
++) {
879 if (val
== AF9015_IR_MODE_DISABLED
) {
880 af9015_properties
[i
].rc_key_map
= NULL
;
881 af9015_properties
[i
].rc_key_map_size
= 0;
883 af9015_set_remote_config(udev
, &af9015_properties
[i
]);
886 /* TS mode - one or two receivers */
887 req
.addr
= AF9015_EEPROM_TS_MODE
;
888 ret
= af9015_rw_udev(udev
, &req
);
891 af9015_config
.dual_mode
= val
;
892 deb_info("%s: TS mode:%d\n", __func__
, af9015_config
.dual_mode
);
894 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
895 size can be static because it is enabled only USB2.0 */
896 for (i
= 0; i
< af9015_properties_count
; i
++) {
897 /* USB1.1 set smaller buffersize and disable 2nd adapter */
898 if (udev
->speed
== USB_SPEED_FULL
) {
899 af9015_properties
[i
].adapter
[0].stream
.u
.bulk
.buffersize
900 = TS_USB11_FRAME_SIZE
;
901 /* disable 2nd adapter because we don't have
903 af9015_config
.dual_mode
= 0;
905 af9015_properties
[i
].adapter
[0].stream
.u
.bulk
.buffersize
906 = TS_USB20_FRAME_SIZE
;
910 if (af9015_config
.dual_mode
) {
911 /* read 2nd demodulator I2C address */
912 req
.addr
= AF9015_EEPROM_DEMOD2_I2C
;
913 ret
= af9015_rw_udev(udev
, &req
);
916 af9015_af9013_config
[1].demod_address
= val
;
918 /* enable 2nd adapter */
919 for (i
= 0; i
< af9015_properties_count
; i
++)
920 af9015_properties
[i
].num_adapters
= 2;
923 /* disable 2nd adapter */
924 for (i
= 0; i
< af9015_properties_count
; i
++)
925 af9015_properties
[i
].num_adapters
= 1;
928 for (i
= 0; i
< af9015_properties
[0].num_adapters
; i
++) {
930 offset
= AF9015_EEPROM_OFFSET
;
932 req
.addr
= AF9015_EEPROM_XTAL_TYPE1
+ offset
;
933 ret
= af9015_rw_udev(udev
, &req
);
938 af9015_af9013_config
[i
].adc_clock
= 28800;
941 af9015_af9013_config
[i
].adc_clock
= 20480;
944 af9015_af9013_config
[i
].adc_clock
= 28000;
947 af9015_af9013_config
[i
].adc_clock
= 25000;
950 deb_info("%s: [%d] xtal:%d set adc_clock:%d\n", __func__
, i
,
951 val
, af9015_af9013_config
[i
].adc_clock
);
954 req
.addr
= AF9015_EEPROM_IF1H
+ offset
;
955 ret
= af9015_rw_udev(udev
, &req
);
958 af9015_af9013_config
[i
].tuner_if
= val
<< 8;
959 req
.addr
= AF9015_EEPROM_IF1L
+ offset
;
960 ret
= af9015_rw_udev(udev
, &req
);
963 af9015_af9013_config
[i
].tuner_if
+= val
;
964 deb_info("%s: [%d] IF1:%d\n", __func__
, i
,
965 af9015_af9013_config
[0].tuner_if
);
968 req
.addr
= AF9015_EEPROM_MT2060_IF1H
+ offset
;
969 ret
= af9015_rw_udev(udev
, &req
);
972 af9015_config
.mt2060_if1
[i
] = val
<< 8;
973 req
.addr
= AF9015_EEPROM_MT2060_IF1L
+ offset
;
974 ret
= af9015_rw_udev(udev
, &req
);
977 af9015_config
.mt2060_if1
[i
] += val
;
978 deb_info("%s: [%d] MT2060 IF1:%d\n", __func__
, i
,
979 af9015_config
.mt2060_if1
[i
]);
982 req
.addr
= AF9015_EEPROM_TUNER_ID1
+ offset
;
983 ret
= af9015_rw_udev(udev
, &req
);
987 case AF9013_TUNER_ENV77H11D5
:
988 case AF9013_TUNER_MT2060
:
989 case AF9013_TUNER_QT1010
:
990 case AF9013_TUNER_UNKNOWN
:
991 case AF9013_TUNER_MT2060_2
:
992 case AF9013_TUNER_TDA18271
:
993 case AF9013_TUNER_QT1010A
:
994 af9015_af9013_config
[i
].rf_spec_inv
= 1;
996 case AF9013_TUNER_MXL5003D
:
997 case AF9013_TUNER_MXL5005D
:
998 case AF9013_TUNER_MXL5005R
:
999 af9015_af9013_config
[i
].rf_spec_inv
= 0;
1001 case AF9013_TUNER_MC44S803
:
1002 af9015_af9013_config
[i
].gpio
[1] = AF9013_GPIO_LO
;
1003 af9015_af9013_config
[i
].rf_spec_inv
= 1;
1005 case AF9013_TUNER_TDA18218
:
1006 warn("tuner NXP TDA18218 not supported yet");
1009 warn("tuner id:%d not supported, please report!", val
);
1013 af9015_af9013_config
[i
].tuner
= val
;
1014 deb_info("%s: [%d] tuner id:%d\n", __func__
, i
, val
);
1019 err("eeprom read failed:%d", ret
);
1021 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
1022 content :-( Override some wrong values here. */
1023 if (le16_to_cpu(udev
->descriptor
.idVendor
) == USB_VID_AVERMEDIA
&&
1024 le16_to_cpu(udev
->descriptor
.idProduct
) == USB_PID_AVERMEDIA_A850
) {
1025 deb_info("%s: AverMedia A850: overriding config\n", __func__
);
1026 /* disable dual mode */
1027 af9015_config
.dual_mode
= 0;
1028 /* disable 2nd adapter */
1029 for (i
= 0; i
< af9015_properties_count
; i
++)
1030 af9015_properties
[i
].num_adapters
= 1;
1032 /* set correct IF */
1033 af9015_af9013_config
[0].tuner_if
= 4570;
1039 static int af9015_identify_state(struct usb_device
*udev
,
1040 struct dvb_usb_device_properties
*props
,
1041 struct dvb_usb_device_description
**desc
,
1046 struct req_t req
= {GET_CONFIG
, 0, 0, 0, 0, 1, &reply
};
1048 ret
= af9015_rw_udev(udev
, &req
);
1052 deb_info("%s: reply:%02x\n", __func__
, reply
);
1061 static int af9015_rc_query(struct dvb_usb_device
*d
, u32
*event
, int *state
)
1064 struct req_t req
= {GET_IR_CODE
, 0, 0, 0, 0, sizeof(buf
), buf
};
1065 struct dvb_usb_rc_key
*keymap
= d
->props
.rc_key_map
;
1068 memset(buf
, 0, sizeof(buf
));
1070 ret
= af9015_ctrl_msg(d
, &req
);
1075 *state
= REMOTE_NO_KEY_PRESSED
;
1077 for (i
= 0; i
< d
->props
.rc_key_map_size
; i
++) {
1078 if (!buf
[1] && rc5_custom(&keymap
[i
]) == buf
[0] &&
1079 rc5_data(&keymap
[i
]) == buf
[2]) {
1080 *event
= keymap
[i
].event
;
1081 *state
= REMOTE_KEY_PRESSED
;
1086 deb_rc("%s: %02x %02x %02x %02x %02x %02x %02x %02x\n",
1087 __func__
, buf
[0], buf
[1], buf
[2], buf
[3], buf
[4],
1088 buf
[5], buf
[6], buf
[7]);
1093 /* init 2nd I2C adapter */
1094 static int af9015_i2c_init(struct dvb_usb_device
*d
)
1097 struct af9015_state
*state
= d
->priv
;
1098 deb_info("%s:\n", __func__
);
1100 strncpy(state
->i2c_adap
.name
, d
->desc
->name
,
1101 sizeof(state
->i2c_adap
.name
));
1102 #ifdef I2C_ADAP_CLASS_TV_DIGITAL
1103 state
->i2c_adap
.class = I2C_ADAP_CLASS_TV_DIGITAL
,
1105 state
->i2c_adap
.class = I2C_CLASS_TV_DIGITAL
,
1107 state
->i2c_adap
.algo
= d
->props
.i2c_algo
;
1108 state
->i2c_adap
.algo_data
= NULL
;
1109 state
->i2c_adap
.dev
.parent
= &d
->udev
->dev
;
1111 i2c_set_adapdata(&state
->i2c_adap
, d
);
1113 ret
= i2c_add_adapter(&state
->i2c_adap
);
1115 err("could not add i2c adapter");
1120 static int af9015_af9013_frontend_attach(struct dvb_usb_adapter
*adap
)
1123 struct af9015_state
*state
= adap
->dev
->priv
;
1124 struct i2c_adapter
*i2c_adap
;
1126 if (adap
->id
== 0) {
1127 /* select I2C adapter */
1128 i2c_adap
= &adap
->dev
->i2c_adap
;
1130 deb_info("%s: init I2C\n", __func__
);
1131 ret
= af9015_i2c_init(adap
->dev
);
1133 /* select I2C adapter */
1134 i2c_adap
= &state
->i2c_adap
;
1136 /* copy firmware to 2nd demodulator */
1137 if (af9015_config
.dual_mode
) {
1138 ret
= af9015_copy_firmware(adap
->dev
);
1140 err("firmware copy to 2nd frontend " \
1141 "failed, will disable it");
1142 af9015_config
.dual_mode
= 0;
1150 /* attach demodulator */
1151 adap
->fe
= dvb_attach(af9013_attach
, &af9015_af9013_config
[adap
->id
],
1154 return adap
->fe
== NULL
? -ENODEV
: 0;
1157 static struct mt2060_config af9015_mt2060_config
= {
1158 .i2c_address
= 0xc0,
1162 static struct qt1010_config af9015_qt1010_config
= {
1163 .i2c_address
= 0xc4,
1166 static struct tda18271_config af9015_tda18271_config
= {
1167 .gate
= TDA18271_GATE_DIGITAL
,
1171 static struct mxl5005s_config af9015_mxl5003_config
= {
1172 .i2c_address
= 0xc6,
1173 .if_freq
= IF_FREQ_4570000HZ
,
1174 .xtal_freq
= CRYSTAL_FREQ_16000000HZ
,
1175 .agc_mode
= MXL_SINGLE_AGC
,
1176 .tracking_filter
= MXL_TF_DEFAULT
,
1177 .rssi_enable
= MXL_RSSI_ENABLE
,
1178 .cap_select
= MXL_CAP_SEL_ENABLE
,
1179 .div_out
= MXL_DIV_OUT_4
,
1180 .clock_out
= MXL_CLOCK_OUT_DISABLE
,
1181 .output_load
= MXL5005S_IF_OUTPUT_LOAD_200_OHM
,
1182 .top
= MXL5005S_TOP_25P2
,
1183 .mod_mode
= MXL_DIGITAL_MODE
,
1184 .if_mode
= MXL_ZERO_IF
,
1185 .AgcMasterByte
= 0x00,
1188 static struct mxl5005s_config af9015_mxl5005_config
= {
1189 .i2c_address
= 0xc6,
1190 .if_freq
= IF_FREQ_4570000HZ
,
1191 .xtal_freq
= CRYSTAL_FREQ_16000000HZ
,
1192 .agc_mode
= MXL_SINGLE_AGC
,
1193 .tracking_filter
= MXL_TF_OFF
,
1194 .rssi_enable
= MXL_RSSI_ENABLE
,
1195 .cap_select
= MXL_CAP_SEL_ENABLE
,
1196 .div_out
= MXL_DIV_OUT_4
,
1197 .clock_out
= MXL_CLOCK_OUT_DISABLE
,
1198 .output_load
= MXL5005S_IF_OUTPUT_LOAD_200_OHM
,
1199 .top
= MXL5005S_TOP_25P2
,
1200 .mod_mode
= MXL_DIGITAL_MODE
,
1201 .if_mode
= MXL_ZERO_IF
,
1202 .AgcMasterByte
= 0x00,
1205 static struct mc44s803_config af9015_mc44s803_config
= {
1206 .i2c_address
= 0xc0,
1210 static int af9015_tuner_attach(struct dvb_usb_adapter
*adap
)
1212 struct af9015_state
*state
= adap
->dev
->priv
;
1213 struct i2c_adapter
*i2c_adap
;
1215 deb_info("%s: \n", __func__
);
1217 /* select I2C adapter */
1219 i2c_adap
= &adap
->dev
->i2c_adap
;
1221 i2c_adap
= &state
->i2c_adap
;
1223 switch (af9015_af9013_config
[adap
->id
].tuner
) {
1224 case AF9013_TUNER_MT2060
:
1225 case AF9013_TUNER_MT2060_2
:
1226 ret
= dvb_attach(mt2060_attach
, adap
->fe
, i2c_adap
,
1227 &af9015_mt2060_config
,
1228 af9015_config
.mt2060_if1
[adap
->id
])
1229 == NULL
? -ENODEV
: 0;
1231 case AF9013_TUNER_QT1010
:
1232 case AF9013_TUNER_QT1010A
:
1233 ret
= dvb_attach(qt1010_attach
, adap
->fe
, i2c_adap
,
1234 &af9015_qt1010_config
) == NULL
? -ENODEV
: 0;
1236 case AF9013_TUNER_TDA18271
:
1237 ret
= dvb_attach(tda18271_attach
, adap
->fe
, 0xc0, i2c_adap
,
1238 &af9015_tda18271_config
) == NULL
? -ENODEV
: 0;
1240 case AF9013_TUNER_MXL5003D
:
1241 ret
= dvb_attach(mxl5005s_attach
, adap
->fe
, i2c_adap
,
1242 &af9015_mxl5003_config
) == NULL
? -ENODEV
: 0;
1244 case AF9013_TUNER_MXL5005D
:
1245 case AF9013_TUNER_MXL5005R
:
1246 ret
= dvb_attach(mxl5005s_attach
, adap
->fe
, i2c_adap
,
1247 &af9015_mxl5005_config
) == NULL
? -ENODEV
: 0;
1249 case AF9013_TUNER_ENV77H11D5
:
1250 ret
= dvb_attach(dvb_pll_attach
, adap
->fe
, 0xc0, i2c_adap
,
1251 DVB_PLL_TDA665X
) == NULL
? -ENODEV
: 0;
1253 case AF9013_TUNER_MC44S803
:
1254 ret
= dvb_attach(mc44s803_attach
, adap
->fe
, i2c_adap
,
1255 &af9015_mc44s803_config
) == NULL
? -ENODEV
: 0;
1257 case AF9013_TUNER_UNKNOWN
:
1260 err("Unknown tuner id:%d",
1261 af9015_af9013_config
[adap
->id
].tuner
);
1266 static struct usb_device_id af9015_usb_table
[] = {
1267 /* 0 */{USB_DEVICE(USB_VID_AFATECH
, USB_PID_AFATECH_AF9015_9015
)},
1268 {USB_DEVICE(USB_VID_AFATECH
, USB_PID_AFATECH_AF9015_9016
)},
1269 {USB_DEVICE(USB_VID_LEADTEK
, USB_PID_WINFAST_DTV_DONGLE_GOLD
)},
1270 {USB_DEVICE(USB_VID_PINNACLE
, USB_PID_PINNACLE_PCTV71E
)},
1271 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_399U
)},
1272 /* 5 */{USB_DEVICE(USB_VID_VISIONPLUS
,
1274 {USB_DEVICE(USB_VID_VISIONPLUS
,
1275 USB_PID_AZUREWAVE_AD_TU700
)},
1276 {USB_DEVICE(USB_VID_TERRATEC
, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2
)},
1277 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_PC160_2T
)},
1278 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_VOLAR_X
)},
1279 /* 10 */{USB_DEVICE(USB_VID_XTENSIONS
, USB_PID_XTENSIONS_XD_380
)},
1280 {USB_DEVICE(USB_VID_MSI_2
, USB_PID_MSI_DIGIVOX_DUO
)},
1281 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_VOLAR_X_2
)},
1282 {USB_DEVICE(USB_VID_TELESTAR
, USB_PID_TELESTAR_STARSTICK_2
)},
1283 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A309
)},
1284 /* 15 */{USB_DEVICE(USB_VID_MSI_2
, USB_PID_MSI_DIGI_VOX_MINI_III
)},
1285 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U
)},
1286 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_2
)},
1287 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_395U_3
)},
1288 {USB_DEVICE(USB_VID_AFATECH
, USB_PID_TREKSTOR_DVBT
)},
1289 /* 20 */{USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A850
)},
1290 {USB_DEVICE(USB_VID_AVERMEDIA
, USB_PID_AVERMEDIA_A805
)},
1291 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_CONCEPTRONIC_CTVDIGRCU
)},
1292 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_MC810
)},
1293 {USB_DEVICE(USB_VID_KYE
, USB_PID_GENIUS_TVGO_DVB_T03
)},
1294 /* 25 */{USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_399U_2
)},
1295 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_KWORLD_PC160_T
)},
1296 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_SVEON_STV20
)},
1297 {USB_DEVICE(USB_VID_KWORLD_2
, USB_PID_TINYTWIN_2
)},
1298 {USB_DEVICE(USB_VID_LEADTEK
, USB_PID_WINFAST_DTV2000DS
)},
1301 MODULE_DEVICE_TABLE(usb
, af9015_usb_table
);
1303 static struct dvb_usb_device_properties af9015_properties
[] = {
1305 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1307 .usb_ctrl
= DEVICE_SPECIFIC
,
1308 .download_firmware
= af9015_download_firmware
,
1309 .firmware
= "dvb-usb-af9015.fw",
1312 .size_of_priv
= sizeof(struct af9015_state
),
1317 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1318 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1320 .pid_filter_count
= 32,
1321 .pid_filter
= af9015_pid_filter
,
1322 .pid_filter_ctrl
= af9015_pid_filter_ctrl
,
1325 af9015_af9013_frontend_attach
,
1326 .tuner_attach
= af9015_tuner_attach
,
1335 af9015_af9013_frontend_attach
,
1336 .tuner_attach
= af9015_tuner_attach
,
1344 TS_USB20_FRAME_SIZE
,
1351 .identify_state
= af9015_identify_state
,
1353 .rc_query
= af9015_rc_query
,
1356 .i2c_algo
= &af9015_i2c_algo
,
1358 .num_device_descs
= 9, /* max 9 */
1361 .name
= "Afatech AF9015 DVB-T USB2.0 stick",
1362 .cold_ids
= {&af9015_usb_table
[0],
1363 &af9015_usb_table
[1], NULL
},
1367 .name
= "Leadtek WinFast DTV Dongle Gold",
1368 .cold_ids
= {&af9015_usb_table
[2], NULL
},
1372 .name
= "Pinnacle PCTV 71e",
1373 .cold_ids
= {&af9015_usb_table
[3], NULL
},
1377 .name
= "KWorld PlusTV Dual DVB-T Stick " \
1379 .cold_ids
= {&af9015_usb_table
[4],
1380 &af9015_usb_table
[25], NULL
},
1384 .name
= "DigitalNow TinyTwin DVB-T Receiver",
1385 .cold_ids
= {&af9015_usb_table
[5],
1386 &af9015_usb_table
[28], NULL
},
1390 .name
= "TwinHan AzureWave AD-TU700(704J)",
1391 .cold_ids
= {&af9015_usb_table
[6], NULL
},
1395 .name
= "TerraTec Cinergy T USB XE",
1396 .cold_ids
= {&af9015_usb_table
[7], NULL
},
1400 .name
= "KWorld PlusTV Dual DVB-T PCI " \
1402 .cold_ids
= {&af9015_usb_table
[8], NULL
},
1406 .name
= "AVerMedia AVerTV DVB-T Volar X",
1407 .cold_ids
= {&af9015_usb_table
[9], NULL
},
1412 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1414 .usb_ctrl
= DEVICE_SPECIFIC
,
1415 .download_firmware
= af9015_download_firmware
,
1416 .firmware
= "dvb-usb-af9015.fw",
1419 .size_of_priv
= sizeof(struct af9015_state
),
1424 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1425 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1427 .pid_filter_count
= 32,
1428 .pid_filter
= af9015_pid_filter
,
1429 .pid_filter_ctrl
= af9015_pid_filter_ctrl
,
1432 af9015_af9013_frontend_attach
,
1433 .tuner_attach
= af9015_tuner_attach
,
1442 af9015_af9013_frontend_attach
,
1443 .tuner_attach
= af9015_tuner_attach
,
1451 TS_USB20_FRAME_SIZE
,
1458 .identify_state
= af9015_identify_state
,
1460 .rc_query
= af9015_rc_query
,
1463 .i2c_algo
= &af9015_i2c_algo
,
1465 .num_device_descs
= 9, /* max 9 */
1468 .name
= "Xtensions XD-380",
1469 .cold_ids
= {&af9015_usb_table
[10], NULL
},
1473 .name
= "MSI DIGIVOX Duo",
1474 .cold_ids
= {&af9015_usb_table
[11], NULL
},
1478 .name
= "Fujitsu-Siemens Slim Mobile USB DVB-T",
1479 .cold_ids
= {&af9015_usb_table
[12], NULL
},
1483 .name
= "Telestar Starstick 2",
1484 .cold_ids
= {&af9015_usb_table
[13], NULL
},
1488 .name
= "AVerMedia A309",
1489 .cold_ids
= {&af9015_usb_table
[14], NULL
},
1493 .name
= "MSI Digi VOX mini III",
1494 .cold_ids
= {&af9015_usb_table
[15], NULL
},
1498 .name
= "KWorld USB DVB-T TV Stick II " \
1500 .cold_ids
= {&af9015_usb_table
[16],
1501 &af9015_usb_table
[17],
1502 &af9015_usb_table
[18], NULL
},
1506 .name
= "TrekStor DVB-T USB Stick",
1507 .cold_ids
= {&af9015_usb_table
[19], NULL
},
1511 .name
= "AverMedia AVerTV Volar Black HD " \
1513 .cold_ids
= {&af9015_usb_table
[20], NULL
},
1518 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1520 .usb_ctrl
= DEVICE_SPECIFIC
,
1521 .download_firmware
= af9015_download_firmware
,
1522 .firmware
= "dvb-usb-af9015.fw",
1525 .size_of_priv
= sizeof(struct af9015_state
),
1530 .caps
= DVB_USB_ADAP_HAS_PID_FILTER
|
1531 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
1533 .pid_filter_count
= 32,
1534 .pid_filter
= af9015_pid_filter
,
1535 .pid_filter_ctrl
= af9015_pid_filter_ctrl
,
1538 af9015_af9013_frontend_attach
,
1539 .tuner_attach
= af9015_tuner_attach
,
1548 af9015_af9013_frontend_attach
,
1549 .tuner_attach
= af9015_tuner_attach
,
1557 TS_USB20_FRAME_SIZE
,
1564 .identify_state
= af9015_identify_state
,
1566 .rc_query
= af9015_rc_query
,
1569 .i2c_algo
= &af9015_i2c_algo
,
1571 .num_device_descs
= 7, /* max 9 */
1574 .name
= "AverMedia AVerTV Volar GPS 805 (A805)",
1575 .cold_ids
= {&af9015_usb_table
[21], NULL
},
1579 .name
= "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1581 .cold_ids
= {&af9015_usb_table
[22], NULL
},
1585 .name
= "KWorld Digial MC-810",
1586 .cold_ids
= {&af9015_usb_table
[23], NULL
},
1590 .name
= "Genius TVGo DVB-T03",
1591 .cold_ids
= {&af9015_usb_table
[24], NULL
},
1595 .name
= "KWorld PlusTV DVB-T PCI Pro Card " \
1597 .cold_ids
= {&af9015_usb_table
[26], NULL
},
1601 .name
= "Sveon STV20 Tuner USB DVB-T HDTV",
1602 .cold_ids
= {&af9015_usb_table
[27], NULL
},
1606 .name
= "Leadtek WinFast DTV2000DS",
1607 .cold_ids
= {&af9015_usb_table
[29], NULL
},
1614 static int af9015_usb_probe(struct usb_interface
*intf
,
1615 const struct usb_device_id
*id
)
1618 struct dvb_usb_device
*d
= NULL
;
1619 struct usb_device
*udev
= interface_to_usbdev(intf
);
1622 deb_info("%s: interface:%d\n", __func__
,
1623 intf
->cur_altsetting
->desc
.bInterfaceNumber
);
1625 /* interface 0 is used by DVB-T receiver and
1626 interface 1 is for remote controller (HID) */
1627 if (intf
->cur_altsetting
->desc
.bInterfaceNumber
== 0) {
1628 ret
= af9015_read_config(udev
);
1632 for (i
= 0; i
< af9015_properties_count
; i
++) {
1633 ret
= dvb_usb_device_init(intf
, &af9015_properties
[i
],
1634 THIS_MODULE
, &d
, adapter_nr
);
1644 ret
= af9015_init(d
);
1650 static void af9015_i2c_exit(struct dvb_usb_device
*d
)
1652 struct af9015_state
*state
= d
->priv
;
1653 deb_info("%s: \n", __func__
);
1655 /* remove 2nd I2C adapter */
1656 if (d
->state
& DVB_USB_STATE_I2C
)
1657 i2c_del_adapter(&state
->i2c_adap
);
1660 static void af9015_usb_device_exit(struct usb_interface
*intf
)
1662 struct dvb_usb_device
*d
= usb_get_intfdata(intf
);
1663 deb_info("%s: \n", __func__
);
1665 /* remove 2nd I2C adapter */
1666 if (d
!= NULL
&& d
->desc
!= NULL
)
1669 dvb_usb_device_exit(intf
);
1672 /* usb specific object needed to register this driver with the usb subsystem */
1673 static struct usb_driver af9015_usb_driver
= {
1674 .name
= "dvb_usb_af9015",
1675 .probe
= af9015_usb_probe
,
1676 .disconnect
= af9015_usb_device_exit
,
1677 .id_table
= af9015_usb_table
,
1681 static int __init
af9015_usb_module_init(void)
1684 ret
= usb_register(&af9015_usb_driver
);
1686 err("module init failed:%d", ret
);
1691 static void __exit
af9015_usb_module_exit(void)
1693 /* deregister this driver from the USB subsystem */
1694 usb_deregister(&af9015_usb_driver
);
1697 module_init(af9015_usb_module_init
);
1698 module_exit(af9015_usb_module_exit
);
1700 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1701 MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1702 MODULE_LICENSE("GPL");