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 void af9015_set_remote_config(struct usb_device *udev,
792 struct dvb_usb_device_properties *props)
794 const struct af9015_setup *table = NULL;
796 if (dvb_usb_af9015_remote) {
797 /* load remote defined as module param */
798 table = af9015_setup_match(dvb_usb_af9015_remote,
799 af9015_setup_modparam);
801 u16 vendor = le16_to_cpu(udev->descriptor.idVendor);
803 if (vendor == USB_VID_AFATECH) {
804 /* Check USB manufacturer and product strings and try
805 to determine correct remote in case of chip vendor
806 reference IDs are used.
807 DO NOT ADD ANYTHING NEW HERE. Use hashes instead.
809 char manufacturer[10];
810 memset(manufacturer, 0, sizeof(manufacturer));
811 usb_string(udev, udev->descriptor.iManufacturer,
812 manufacturer, sizeof(manufacturer));
813 if (!strcmp("Geniatech", manufacturer)) {
814 /* iManufacturer 1 Geniatech
816 table = af9015_setup_match(
817 AF9015_REMOTE_MYGICTV_U718,
818 af9015_setup_modparam);
819 } else if (!strcmp("MSI", manufacturer)) {
820 /* iManufacturer 1 MSI
821 iProduct 2 MSI K-VOX */
822 table = af9015_setup_match(
823 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
824 af9015_setup_modparam);
825 } else if (udev->descriptor.idProduct ==
826 cpu_to_le16(USB_PID_TREKSTOR_DVBT)) {
827 table = &(const struct af9015_setup){ 0,
828 af9015_rc_keys_trekstor,
829 ARRAY_SIZE(af9015_rc_keys_trekstor),
830 af9015_ir_table_trekstor,
831 ARRAY_SIZE(af9015_ir_table_trekstor)
835 table = af9015_setup_match(vendor, af9015_setup_usbids);
839 props->rc_key_map = table->rc_key_map;
840 props->rc_key_map_size = table->rc_key_map_size;
841 af9015_config.ir_table = table->ir_table;
842 af9015_config.ir_table_size = table->ir_table_size;
846 static int af9015_read_config(struct usb_device *udev)
849 u8 val, i, offset = 0;
850 struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val};
852 /* IR remote controller */
853 req.addr = AF9015_EEPROM_IR_MODE;
854 /* first message will timeout often due to possible hw bug */
855 for (i = 0; i < 4; i++) {
856 ret = af9015_rw_udev(udev, &req);
863 ret = af9015_eeprom_hash(udev);
867 deb_info("%s: IR mode:%d\n", __func__, val);
868 for (i = 0; i < af9015_properties_count; i++) {
869 if (val == AF9015_IR_MODE_DISABLED) {
870 af9015_properties[i].rc_key_map = NULL;
871 af9015_properties[i].rc_key_map_size = 0;
873 af9015_set_remote_config(udev, &af9015_properties[i]);
876 /* TS mode - one or two receivers */
877 req.addr = AF9015_EEPROM_TS_MODE;
878 ret = af9015_rw_udev(udev, &req);
881 af9015_config.dual_mode = val;
882 deb_info("%s: TS mode:%d\n", __func__, af9015_config.dual_mode);
884 /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
885 size can be static because it is enabled only USB2.0 */
886 for (i = 0; i < af9015_properties_count; i++) {
887 /* USB1.1 set smaller buffersize and disable 2nd adapter */
888 if (udev->speed == USB_SPEED_FULL) {
889 af9015_properties[i].adapter[0].stream.u.bulk.buffersize
890 = TS_USB11_FRAME_SIZE;
891 /* disable 2nd adapter because we don't have
893 af9015_config.dual_mode = 0;
895 af9015_properties[i].adapter[0].stream.u.bulk.buffersize
896 = TS_USB20_FRAME_SIZE;
900 if (af9015_config.dual_mode) {
901 /* read 2nd demodulator I2C address */
902 req.addr = AF9015_EEPROM_DEMOD2_I2C;
903 ret = af9015_rw_udev(udev, &req);
906 af9015_af9013_config[1].demod_address = val;
908 /* enable 2nd adapter */
909 for (i = 0; i < af9015_properties_count; i++)
910 af9015_properties[i].num_adapters = 2;
913 /* disable 2nd adapter */
914 for (i = 0; i < af9015_properties_count; i++)
915 af9015_properties[i].num_adapters = 1;
918 for (i = 0; i < af9015_properties[0].num_adapters; i++) {
920 offset = AF9015_EEPROM_OFFSET;
922 req.addr = AF9015_EEPROM_XTAL_TYPE1 + offset;
923 ret = af9015_rw_udev(udev, &req);
928 af9015_af9013_config[i].adc_clock = 28800;
931 af9015_af9013_config[i].adc_clock = 20480;
934 af9015_af9013_config[i].adc_clock = 28000;
937 af9015_af9013_config[i].adc_clock = 25000;
940 deb_info("%s: [%d] xtal:%d set adc_clock:%d\n", __func__, i,
941 val, af9015_af9013_config[i].adc_clock);
944 req.addr = AF9015_EEPROM_IF1H + offset;
945 ret = af9015_rw_udev(udev, &req);
948 af9015_af9013_config[i].tuner_if = val << 8;
949 req.addr = AF9015_EEPROM_IF1L + offset;
950 ret = af9015_rw_udev(udev, &req);
953 af9015_af9013_config[i].tuner_if += val;
954 deb_info("%s: [%d] IF1:%d\n", __func__, i,
955 af9015_af9013_config[0].tuner_if);
958 req.addr = AF9015_EEPROM_MT2060_IF1H + offset;
959 ret = af9015_rw_udev(udev, &req);
962 af9015_config.mt2060_if1[i] = val << 8;
963 req.addr = AF9015_EEPROM_MT2060_IF1L + offset;
964 ret = af9015_rw_udev(udev, &req);
967 af9015_config.mt2060_if1[i] += val;
968 deb_info("%s: [%d] MT2060 IF1:%d\n", __func__, i,
969 af9015_config.mt2060_if1[i]);
972 req.addr = AF9015_EEPROM_TUNER_ID1 + offset;
973 ret = af9015_rw_udev(udev, &req);
977 case AF9013_TUNER_ENV77H11D5:
978 case AF9013_TUNER_MT2060:
979 case AF9013_TUNER_QT1010:
980 case AF9013_TUNER_UNKNOWN:
981 case AF9013_TUNER_MT2060_2:
982 case AF9013_TUNER_TDA18271:
983 case AF9013_TUNER_QT1010A:
984 af9015_af9013_config[i].rf_spec_inv = 1;
986 case AF9013_TUNER_MXL5003D:
987 case AF9013_TUNER_MXL5005D:
988 case AF9013_TUNER_MXL5005R:
989 af9015_af9013_config[i].rf_spec_inv = 0;
991 case AF9013_TUNER_MC44S803:
992 af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO;
993 af9015_af9013_config[i].rf_spec_inv = 1;
996 warn("tuner id:%d not supported, please report!", val);
1000 af9015_af9013_config[i].tuner = val;
1001 deb_info("%s: [%d] tuner id:%d\n", __func__, i, val);
1006 err("eeprom read failed:%d", ret);
1008 /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
1009 content :-( Override some wrong values here. */
1010 if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
1011 le16_to_cpu(udev->descriptor.idProduct) == USB_PID_AVERMEDIA_A850) {
1012 deb_info("%s: AverMedia A850: overriding config\n", __func__);
1013 /* disable dual mode */
1014 af9015_config.dual_mode = 0;
1015 /* disable 2nd adapter */
1016 for (i = 0; i < af9015_properties_count; i++)
1017 af9015_properties[i].num_adapters = 1;
1019 /* set correct IF */
1020 af9015_af9013_config[0].tuner_if = 4570;
1026 static int af9015_identify_state(struct usb_device *udev,
1027 struct dvb_usb_device_properties *props,
1028 struct dvb_usb_device_description **desc,
1033 struct req_t req = {GET_CONFIG, 0, 0, 0, 0, 1, &reply};
1035 ret = af9015_rw_udev(udev, &req);
1039 deb_info("%s: reply:%02x\n", __func__, reply);
1048 static int af9015_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
1051 struct req_t req = {GET_IR_CODE, 0, 0, 0, 0, sizeof(buf), buf};
1052 struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
1055 memset(buf, 0, sizeof(buf));
1057 ret = af9015_ctrl_msg(d, &req);
1062 *state = REMOTE_NO_KEY_PRESSED;
1064 for (i = 0; i < d->props.rc_key_map_size; i++) {
1065 if (!buf[1] && rc5_custom(&keymap[i]) == buf[0] &&
1066 rc5_data(&keymap[i]) == buf[2]) {
1067 *event = keymap[i].event;
1068 *state = REMOTE_KEY_PRESSED;
1073 deb_rc("%s: %02x %02x %02x %02x %02x %02x %02x %02x\n",
1074 __func__, buf[0], buf[1], buf[2], buf[3], buf[4],
1075 buf[5], buf[6], buf[7]);
1080 /* init 2nd I2C adapter */
1081 static int af9015_i2c_init(struct dvb_usb_device *d)
1084 struct af9015_state *state = d->priv;
1085 deb_info("%s:\n", __func__);
1087 strncpy(state->i2c_adap.name, d->desc->name,
1088 sizeof(state->i2c_adap.name));
1089 #ifdef I2C_ADAP_CLASS_TV_DIGITAL
1090 state->i2c_adap.class = I2C_ADAP_CLASS_TV_DIGITAL,
1092 state->i2c_adap.class = I2C_CLASS_TV_DIGITAL,
1094 state->i2c_adap.algo = d->props.i2c_algo;
1095 state->i2c_adap.algo_data = NULL;
1096 state->i2c_adap.dev.parent = &d->udev->dev;
1098 i2c_set_adapdata(&state->i2c_adap, d);
1100 ret = i2c_add_adapter(&state->i2c_adap);
1102 err("could not add i2c adapter");
1107 static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap)
1110 struct af9015_state *state = adap->dev->priv;
1111 struct i2c_adapter *i2c_adap;
1113 if (adap->id == 0) {
1114 /* select I2C adapter */
1115 i2c_adap = &adap->dev->i2c_adap;
1117 deb_info("%s: init I2C\n", __func__);
1118 ret = af9015_i2c_init(adap->dev);
1120 /* select I2C adapter */
1121 i2c_adap = &state->i2c_adap;
1123 /* copy firmware to 2nd demodulator */
1124 if (af9015_config.dual_mode) {
1125 ret = af9015_copy_firmware(adap->dev);
1127 err("firmware copy to 2nd frontend " \
1128 "failed, will disable it");
1129 af9015_config.dual_mode = 0;
1137 /* attach demodulator */
1138 adap->fe = dvb_attach(af9013_attach, &af9015_af9013_config[adap->id],
1141 return adap->fe == NULL ? -ENODEV : 0;
1144 static struct mt2060_config af9015_mt2060_config = {
1145 .i2c_address = 0xc0,
1149 static struct qt1010_config af9015_qt1010_config = {
1150 .i2c_address = 0xc4,
1153 static struct tda18271_config af9015_tda18271_config = {
1154 .gate = TDA18271_GATE_DIGITAL,
1158 static struct mxl5005s_config af9015_mxl5003_config = {
1159 .i2c_address = 0xc6,
1160 .if_freq = IF_FREQ_4570000HZ,
1161 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1162 .agc_mode = MXL_SINGLE_AGC,
1163 .tracking_filter = MXL_TF_DEFAULT,
1164 .rssi_enable = MXL_RSSI_ENABLE,
1165 .cap_select = MXL_CAP_SEL_ENABLE,
1166 .div_out = MXL_DIV_OUT_4,
1167 .clock_out = MXL_CLOCK_OUT_DISABLE,
1168 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1169 .top = MXL5005S_TOP_25P2,
1170 .mod_mode = MXL_DIGITAL_MODE,
1171 .if_mode = MXL_ZERO_IF,
1172 .AgcMasterByte = 0x00,
1175 static struct mxl5005s_config af9015_mxl5005_config = {
1176 .i2c_address = 0xc6,
1177 .if_freq = IF_FREQ_4570000HZ,
1178 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
1179 .agc_mode = MXL_SINGLE_AGC,
1180 .tracking_filter = MXL_TF_OFF,
1181 .rssi_enable = MXL_RSSI_ENABLE,
1182 .cap_select = MXL_CAP_SEL_ENABLE,
1183 .div_out = MXL_DIV_OUT_4,
1184 .clock_out = MXL_CLOCK_OUT_DISABLE,
1185 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
1186 .top = MXL5005S_TOP_25P2,
1187 .mod_mode = MXL_DIGITAL_MODE,
1188 .if_mode = MXL_ZERO_IF,
1189 .AgcMasterByte = 0x00,
1192 static struct mc44s803_config af9015_mc44s803_config = {
1193 .i2c_address = 0xc0,
1197 static int af9015_tuner_attach(struct dvb_usb_adapter *adap)
1199 struct af9015_state *state = adap->dev->priv;
1200 struct i2c_adapter *i2c_adap;
1202 deb_info("%s: \n", __func__);
1204 /* select I2C adapter */
1206 i2c_adap = &adap->dev->i2c_adap;
1208 i2c_adap = &state->i2c_adap;
1210 switch (af9015_af9013_config[adap->id].tuner) {
1211 case AF9013_TUNER_MT2060:
1212 case AF9013_TUNER_MT2060_2:
1213 ret = dvb_attach(mt2060_attach, adap->fe, i2c_adap,
1214 &af9015_mt2060_config,
1215 af9015_config.mt2060_if1[adap->id])
1216 == NULL ? -ENODEV : 0;
1218 case AF9013_TUNER_QT1010:
1219 case AF9013_TUNER_QT1010A:
1220 ret = dvb_attach(qt1010_attach, adap->fe, i2c_adap,
1221 &af9015_qt1010_config) == NULL ? -ENODEV : 0;
1223 case AF9013_TUNER_TDA18271:
1224 ret = dvb_attach(tda18271_attach, adap->fe, 0xc0, i2c_adap,
1225 &af9015_tda18271_config) == NULL ? -ENODEV : 0;
1227 case AF9013_TUNER_MXL5003D:
1228 ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1229 &af9015_mxl5003_config) == NULL ? -ENODEV : 0;
1231 case AF9013_TUNER_MXL5005D:
1232 case AF9013_TUNER_MXL5005R:
1233 ret = dvb_attach(mxl5005s_attach, adap->fe, i2c_adap,
1234 &af9015_mxl5005_config) == NULL ? -ENODEV : 0;
1236 case AF9013_TUNER_ENV77H11D5:
1237 ret = dvb_attach(dvb_pll_attach, adap->fe, 0xc0, i2c_adap,
1238 DVB_PLL_TDA665X) == NULL ? -ENODEV : 0;
1240 case AF9013_TUNER_MC44S803:
1241 ret = dvb_attach(mc44s803_attach, adap->fe, i2c_adap,
1242 &af9015_mc44s803_config) == NULL ? -ENODEV : 0;
1244 case AF9013_TUNER_UNKNOWN:
1247 err("Unknown tuner id:%d",
1248 af9015_af9013_config[adap->id].tuner);
1253 static struct usb_device_id af9015_usb_table[] = {
1254 /* 0 */{USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9015)},
1255 {USB_DEVICE(USB_VID_AFATECH, USB_PID_AFATECH_AF9015_9016)},
1256 {USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_GOLD)},
1257 {USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV71E)},
1258 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U)},
1259 /* 5 */{USB_DEVICE(USB_VID_VISIONPLUS,
1261 {USB_DEVICE(USB_VID_VISIONPLUS,
1262 USB_PID_AZUREWAVE_AD_TU700)},
1263 {USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_USB_XE_REV2)},
1264 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_2T)},
1265 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X)},
1266 /* 10 */{USB_DEVICE(USB_VID_XTENSIONS, USB_PID_XTENSIONS_XD_380)},
1267 {USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGIVOX_DUO)},
1268 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_X_2)},
1269 {USB_DEVICE(USB_VID_TELESTAR, USB_PID_TELESTAR_STARSTICK_2)},
1270 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A309)},
1271 /* 15 */{USB_DEVICE(USB_VID_MSI_2, USB_PID_MSI_DIGI_VOX_MINI_III)},
1272 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U)},
1273 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)},
1274 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)},
1275 {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)},
1276 /* 20 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)},
1277 {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)},
1278 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)},
1279 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)},
1280 {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)},
1281 /* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)},
1282 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)},
1283 {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)},
1286 MODULE_DEVICE_TABLE(usb, af9015_usb_table);
1288 static struct dvb_usb_device_properties af9015_properties[] = {
1290 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1292 .usb_ctrl = DEVICE_SPECIFIC,
1293 .download_firmware = af9015_download_firmware,
1294 .firmware = "dvb-usb-af9015.fw",
1297 .size_of_priv = sizeof(struct af9015_state),
1302 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1303 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1305 .pid_filter_count = 32,
1306 .pid_filter = af9015_pid_filter,
1307 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1310 af9015_af9013_frontend_attach,
1311 .tuner_attach = af9015_tuner_attach,
1320 af9015_af9013_frontend_attach,
1321 .tuner_attach = af9015_tuner_attach,
1329 TS_USB20_FRAME_SIZE,
1336 .identify_state = af9015_identify_state,
1338 .rc_query = af9015_rc_query,
1341 .i2c_algo = &af9015_i2c_algo,
1343 .num_device_descs = 9, /* max 9 */
1346 .name = "Afatech AF9015 DVB-T USB2.0 stick",
1347 .cold_ids = {&af9015_usb_table[0],
1348 &af9015_usb_table[1], NULL},
1352 .name = "Leadtek WinFast DTV Dongle Gold",
1353 .cold_ids = {&af9015_usb_table[2], NULL},
1357 .name = "Pinnacle PCTV 71e",
1358 .cold_ids = {&af9015_usb_table[3], NULL},
1362 .name = "KWorld PlusTV Dual DVB-T Stick " \
1364 .cold_ids = {&af9015_usb_table[4],
1365 &af9015_usb_table[25], NULL},
1369 .name = "DigitalNow TinyTwin DVB-T Receiver",
1370 .cold_ids = {&af9015_usb_table[5], NULL},
1374 .name = "TwinHan AzureWave AD-TU700(704J)",
1375 .cold_ids = {&af9015_usb_table[6], NULL},
1379 .name = "TerraTec Cinergy T USB XE",
1380 .cold_ids = {&af9015_usb_table[7], NULL},
1384 .name = "KWorld PlusTV Dual DVB-T PCI " \
1386 .cold_ids = {&af9015_usb_table[8], NULL},
1390 .name = "AVerMedia AVerTV DVB-T Volar X",
1391 .cold_ids = {&af9015_usb_table[9], NULL},
1396 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1398 .usb_ctrl = DEVICE_SPECIFIC,
1399 .download_firmware = af9015_download_firmware,
1400 .firmware = "dvb-usb-af9015.fw",
1403 .size_of_priv = sizeof(struct af9015_state),
1408 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1409 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1411 .pid_filter_count = 32,
1412 .pid_filter = af9015_pid_filter,
1413 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1416 af9015_af9013_frontend_attach,
1417 .tuner_attach = af9015_tuner_attach,
1426 af9015_af9013_frontend_attach,
1427 .tuner_attach = af9015_tuner_attach,
1435 TS_USB20_FRAME_SIZE,
1442 .identify_state = af9015_identify_state,
1444 .rc_query = af9015_rc_query,
1447 .i2c_algo = &af9015_i2c_algo,
1449 .num_device_descs = 9, /* max 9 */
1452 .name = "Xtensions XD-380",
1453 .cold_ids = {&af9015_usb_table[10], NULL},
1457 .name = "MSI DIGIVOX Duo",
1458 .cold_ids = {&af9015_usb_table[11], NULL},
1462 .name = "Fujitsu-Siemens Slim Mobile USB DVB-T",
1463 .cold_ids = {&af9015_usb_table[12], NULL},
1467 .name = "Telestar Starstick 2",
1468 .cold_ids = {&af9015_usb_table[13], NULL},
1472 .name = "AVerMedia A309",
1473 .cold_ids = {&af9015_usb_table[14], NULL},
1477 .name = "MSI Digi VOX mini III",
1478 .cold_ids = {&af9015_usb_table[15], NULL},
1482 .name = "KWorld USB DVB-T TV Stick II " \
1484 .cold_ids = {&af9015_usb_table[16],
1485 &af9015_usb_table[17],
1486 &af9015_usb_table[18], NULL},
1490 .name = "TrekStor DVB-T USB Stick",
1491 .cold_ids = {&af9015_usb_table[19], NULL},
1495 .name = "AverMedia AVerTV Volar Black HD " \
1497 .cold_ids = {&af9015_usb_table[20], NULL},
1502 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1504 .usb_ctrl = DEVICE_SPECIFIC,
1505 .download_firmware = af9015_download_firmware,
1506 .firmware = "dvb-usb-af9015.fw",
1509 .size_of_priv = sizeof(struct af9015_state),
1514 .caps = DVB_USB_ADAP_HAS_PID_FILTER |
1515 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1517 .pid_filter_count = 32,
1518 .pid_filter = af9015_pid_filter,
1519 .pid_filter_ctrl = af9015_pid_filter_ctrl,
1522 af9015_af9013_frontend_attach,
1523 .tuner_attach = af9015_tuner_attach,
1532 af9015_af9013_frontend_attach,
1533 .tuner_attach = af9015_tuner_attach,
1541 TS_USB20_FRAME_SIZE,
1548 .identify_state = af9015_identify_state,
1550 .rc_query = af9015_rc_query,
1553 .i2c_algo = &af9015_i2c_algo,
1555 .num_device_descs = 6, /* max 9 */
1558 .name = "AverMedia AVerTV Volar GPS 805 (A805)",
1559 .cold_ids = {&af9015_usb_table[21], NULL},
1563 .name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \
1565 .cold_ids = {&af9015_usb_table[22], NULL},
1569 .name = "KWorld Digial MC-810",
1570 .cold_ids = {&af9015_usb_table[23], NULL},
1574 .name = "Genius TVGo DVB-T03",
1575 .cold_ids = {&af9015_usb_table[24], NULL},
1579 .name = "KWorld PlusTV DVB-T PCI Pro Card " \
1581 .cold_ids = {&af9015_usb_table[26], NULL},
1585 .name = "Sveon STV20 Tuner USB DVB-T HDTV",
1586 .cold_ids = {&af9015_usb_table[27], NULL},
1593 static int af9015_usb_probe(struct usb_interface *intf,
1594 const struct usb_device_id *id)
1597 struct dvb_usb_device *d = NULL;
1598 struct usb_device *udev = interface_to_usbdev(intf);
1601 deb_info("%s: interface:%d\n", __func__,
1602 intf->cur_altsetting->desc.bInterfaceNumber);
1604 /* interface 0 is used by DVB-T receiver and
1605 interface 1 is for remote controller (HID) */
1606 if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
1607 ret = af9015_read_config(udev);
1611 for (i = 0; i < af9015_properties_count; i++) {
1612 ret = dvb_usb_device_init(intf, &af9015_properties[i],
1613 THIS_MODULE, &d, adapter_nr);
1623 ret = af9015_init(d);
1629 static void af9015_i2c_exit(struct dvb_usb_device *d)
1631 struct af9015_state *state = d->priv;
1632 deb_info("%s: \n", __func__);
1634 /* remove 2nd I2C adapter */
1635 if (d->state & DVB_USB_STATE_I2C)
1636 i2c_del_adapter(&state->i2c_adap);
1639 static void af9015_usb_device_exit(struct usb_interface *intf)
1641 struct dvb_usb_device *d = usb_get_intfdata(intf);
1642 deb_info("%s: \n", __func__);
1644 /* remove 2nd I2C adapter */
1645 if (d != NULL && d->desc != NULL)
1648 dvb_usb_device_exit(intf);
1651 /* usb specific object needed to register this driver with the usb subsystem */
1652 static struct usb_driver af9015_usb_driver = {
1653 .name = "dvb_usb_af9015",
1654 .probe = af9015_usb_probe,
1655 .disconnect = af9015_usb_device_exit,
1656 .id_table = af9015_usb_table,
1660 static int __init af9015_usb_module_init(void)
1663 ret = usb_register(&af9015_usb_driver);
1665 err("module init failed:%d", ret);
1670 static void __exit af9015_usb_module_exit(void)
1672 /* deregister this driver from the USB subsystem */
1673 usb_deregister(&af9015_usb_driver);
1676 module_init(af9015_usb_module_init);
1677 module_exit(af9015_usb_module_exit);
1679 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1680 MODULE_DESCRIPTION("Driver for Afatech AF9015 DVB-T");
1681 MODULE_LICENSE("GPL");