diff options
Diffstat (limited to 'drivers/media/dvb/dvb-usb/af9015.c')
-rw-r--r-- | drivers/media/dvb/dvb-usb/af9015.c | 351 |
1 files changed, 179 insertions, 172 deletions
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 8b60a601fb8..d7975383d31 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
@@ -21,6 +21,8 @@ | |||
21 | * | 21 | * |
22 | */ | 22 | */ |
23 | 23 | ||
24 | #include <linux/hash.h> | ||
25 | |||
24 | #include "af9015.h" | 26 | #include "af9015.h" |
25 | #include "af9013.h" | 27 | #include "af9013.h" |
26 | #include "mt2060.h" | 28 | #include "mt2060.h" |
@@ -553,26 +555,45 @@ exit: | |||
553 | return ret; | 555 | return ret; |
554 | } | 556 | } |
555 | 557 | ||
556 | /* dump eeprom */ | 558 | /* hash (and dump) eeprom */ |
557 | static int af9015_eeprom_dump(struct dvb_usb_device *d) | 559 | static int af9015_eeprom_hash(struct usb_device *udev) |
558 | { | 560 | { |
559 | u8 reg, val; | 561 | static const unsigned int eeprom_size = 256; |
562 | unsigned int reg; | ||
563 | int ret; | ||
564 | u8 val, *eeprom; | ||
565 | struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val}; | ||
560 | 566 | ||
561 | for (reg = 0; ; reg++) { | 567 | eeprom = kmalloc(eeprom_size, GFP_KERNEL); |
562 | if (reg % 16 == 0) { | 568 | if (eeprom == NULL) |
563 | if (reg) | 569 | return -ENOMEM; |
564 | deb_info(KERN_CONT "\n"); | 570 | |
565 | deb_info(KERN_DEBUG "%02x:", reg); | 571 | for (reg = 0; reg < eeprom_size; reg++) { |
566 | } | 572 | req.addr = reg; |
567 | if (af9015_read_reg_i2c(d, AF9015_I2C_EEPROM, reg, &val) == 0) | 573 | ret = af9015_rw_udev(udev, &req); |
568 | deb_info(KERN_CONT " %02x", val); | 574 | if (ret) |
569 | else | 575 | goto free; |
570 | deb_info(KERN_CONT " --"); | 576 | eeprom[reg] = val; |
571 | if (reg == 0xff) | ||
572 | break; | ||
573 | } | 577 | } |
574 | deb_info(KERN_CONT "\n"); | 578 | |
575 | return 0; | 579 | if (dvb_usb_af9015_debug & 0x01) |
580 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, eeprom, | ||
581 | eeprom_size); | ||
582 | |||
583 | BUG_ON(eeprom_size % 4); | ||
584 | |||
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]); | ||
589 | } | ||
590 | |||
591 | deb_info("%s: eeprom sum=%.8x\n", __func__, af9015_config.eeprom_sum); | ||
592 | |||
593 | ret = 0; | ||
594 | free: | ||
595 | kfree(eeprom); | ||
596 | return ret; | ||
576 | } | 597 | } |
577 | 598 | ||
578 | static int af9015_download_ir_table(struct dvb_usb_device *d) | 599 | static int af9015_download_ir_table(struct dvb_usb_device *d) |
@@ -711,12 +732,132 @@ error: | |||
711 | return ret; | 732 | return ret; |
712 | } | 733 | } |
713 | 734 | ||
735 | struct af9015_setup { | ||
736 | unsigned int id; | ||
737 | struct dvb_usb_rc_key *rc_key_map; | ||
738 | unsigned int rc_key_map_size; | ||
739 | u8 *ir_table; | ||
740 | unsigned int ir_table_size; | ||
741 | }; | ||
742 | |||
743 | static const struct af9015_setup *af9015_setup_match(unsigned int id, | ||
744 | const struct af9015_setup *table) | ||
745 | { | ||
746 | for (; table->rc_key_map; table++) | ||
747 | if (table->id == id) | ||
748 | return table; | ||
749 | return NULL; | ||
750 | } | ||
751 | |||
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) }, | ||
768 | { } | ||
769 | }; | ||
770 | |||
771 | /* don't add new entries here anymore, use hashes instead */ | ||
772 | static const struct af9015_setup af9015_setup_usbids[] = { | ||
773 | { USB_VID_LEADTEK, | ||
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) }, | ||
782 | { USB_VID_AVERMEDIA, | ||
783 | af9015_rc_keys_avermedia, ARRAY_SIZE(af9015_rc_keys_avermedia), | ||
784 | af9015_ir_table_avermedia, ARRAY_SIZE(af9015_ir_table_avermedia) }, | ||
785 | { USB_VID_MSI_2, | ||
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) }, | ||
788 | { } | ||
789 | }; | ||
790 | |||
791 | static const struct af9015_setup af9015_setup_hashes[] = { | ||
792 | { 0xb8feb708, | ||
793 | af9015_rc_keys_msi, ARRAY_SIZE(af9015_rc_keys_msi), | ||
794 | af9015_ir_table_msi, ARRAY_SIZE(af9015_ir_table_msi) }, | ||
795 | { 0xa3703d00, | ||
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) }, | ||
798 | { 0x9b7dc64e, | ||
799 | af9015_rc_keys_mygictv, ARRAY_SIZE(af9015_rc_keys_mygictv), | ||
800 | af9015_ir_table_mygictv, ARRAY_SIZE(af9015_ir_table_mygictv) }, | ||
801 | { } | ||
802 | }; | ||
803 | |||
804 | static void af9015_set_remote_config(struct usb_device *udev, | ||
805 | struct dvb_usb_device_properties *props) | ||
806 | { | ||
807 | const struct af9015_setup *table = NULL; | ||
808 | |||
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); | ||
813 | } else { | ||
814 | u16 vendor = le16_to_cpu(udev->descriptor.idVendor); | ||
815 | |||
816 | table = af9015_setup_match(af9015_config.eeprom_sum, | ||
817 | af9015_setup_hashes); | ||
818 | |||
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. | ||
824 | */ | ||
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) | ||
842 | }; | ||
843 | } | ||
844 | } else if (!table) | ||
845 | table = af9015_setup_match(vendor, af9015_setup_usbids); | ||
846 | } | ||
847 | |||
848 | if (table) { | ||
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; | ||
853 | } | ||
854 | } | ||
855 | |||
714 | static int af9015_read_config(struct usb_device *udev) | 856 | static int af9015_read_config(struct usb_device *udev) |
715 | { | 857 | { |
716 | int ret; | 858 | int ret; |
717 | u8 val, i, offset = 0; | 859 | u8 val, i, offset = 0; |
718 | struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val}; | 860 | struct req_t req = {READ_I2C, AF9015_I2C_EEPROM, 0, 0, 1, 1, &val}; |
719 | char manufacturer[10]; | ||
720 | 861 | ||
721 | /* IR remote controller */ | 862 | /* IR remote controller */ |
722 | req.addr = AF9015_EEPROM_IR_MODE; | 863 | req.addr = AF9015_EEPROM_IR_MODE; |
@@ -728,158 +869,18 @@ static int af9015_read_config(struct usb_device *udev) | |||
728 | } | 869 | } |
729 | if (ret) | 870 | if (ret) |
730 | goto error; | 871 | goto error; |
872 | |||
873 | ret = af9015_eeprom_hash(udev); | ||
874 | if (ret) | ||
875 | goto error; | ||
876 | |||
731 | deb_info("%s: IR mode:%d\n", __func__, val); | 877 | deb_info("%s: IR mode:%d\n", __func__, val); |
732 | for (i = 0; i < af9015_properties_count; i++) { | 878 | for (i = 0; i < af9015_properties_count; i++) { |
733 | if (val == AF9015_IR_MODE_DISABLED) { | 879 | if (val == AF9015_IR_MODE_DISABLED) { |
734 | af9015_properties[i].rc_key_map = NULL; | 880 | af9015_properties[i].rc_key_map = NULL; |
735 | af9015_properties[i].rc_key_map_size = 0; | 881 | af9015_properties[i].rc_key_map_size = 0; |
736 | } else if (dvb_usb_af9015_remote) { | 882 | } else |
737 | /* load remote defined as module param */ | 883 | af9015_set_remote_config(udev, &af9015_properties[i]); |
738 | switch (dvb_usb_af9015_remote) { | ||
739 | case AF9015_REMOTE_A_LINK_DTU_M: | ||
740 | af9015_properties[i].rc_key_map = | ||
741 | af9015_rc_keys_a_link; | ||
742 | af9015_properties[i].rc_key_map_size = | ||
743 | ARRAY_SIZE(af9015_rc_keys_a_link); | ||
744 | af9015_config.ir_table = af9015_ir_table_a_link; | ||
745 | af9015_config.ir_table_size = | ||
746 | ARRAY_SIZE(af9015_ir_table_a_link); | ||
747 | break; | ||
748 | case AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3: | ||
749 | af9015_properties[i].rc_key_map = | ||
750 | af9015_rc_keys_msi; | ||
751 | af9015_properties[i].rc_key_map_size = | ||
752 | ARRAY_SIZE(af9015_rc_keys_msi); | ||
753 | af9015_config.ir_table = af9015_ir_table_msi; | ||
754 | af9015_config.ir_table_size = | ||
755 | ARRAY_SIZE(af9015_ir_table_msi); | ||
756 | break; | ||
757 | case AF9015_REMOTE_MYGICTV_U718: | ||
758 | af9015_properties[i].rc_key_map = | ||
759 | af9015_rc_keys_mygictv; | ||
760 | af9015_properties[i].rc_key_map_size = | ||
761 | ARRAY_SIZE(af9015_rc_keys_mygictv); | ||
762 | af9015_config.ir_table = | ||
763 | af9015_ir_table_mygictv; | ||
764 | af9015_config.ir_table_size = | ||
765 | ARRAY_SIZE(af9015_ir_table_mygictv); | ||
766 | break; | ||
767 | case AF9015_REMOTE_DIGITTRADE_DVB_T: | ||
768 | af9015_properties[i].rc_key_map = | ||
769 | af9015_rc_keys_digittrade; | ||
770 | af9015_properties[i].rc_key_map_size = | ||
771 | ARRAY_SIZE(af9015_rc_keys_digittrade); | ||
772 | af9015_config.ir_table = | ||
773 | af9015_ir_table_digittrade; | ||
774 | af9015_config.ir_table_size = | ||
775 | ARRAY_SIZE(af9015_ir_table_digittrade); | ||
776 | break; | ||
777 | case AF9015_REMOTE_AVERMEDIA_KS: | ||
778 | af9015_properties[i].rc_key_map = | ||
779 | af9015_rc_keys_avermedia; | ||
780 | af9015_properties[i].rc_key_map_size = | ||
781 | ARRAY_SIZE(af9015_rc_keys_avermedia); | ||
782 | af9015_config.ir_table = | ||
783 | af9015_ir_table_avermedia_ks; | ||
784 | af9015_config.ir_table_size = | ||
785 | ARRAY_SIZE(af9015_ir_table_avermedia_ks); | ||
786 | break; | ||
787 | } | ||
788 | } else { | ||
789 | switch (le16_to_cpu(udev->descriptor.idVendor)) { | ||
790 | case USB_VID_LEADTEK: | ||
791 | af9015_properties[i].rc_key_map = | ||
792 | af9015_rc_keys_leadtek; | ||
793 | af9015_properties[i].rc_key_map_size = | ||
794 | ARRAY_SIZE(af9015_rc_keys_leadtek); | ||
795 | af9015_config.ir_table = | ||
796 | af9015_ir_table_leadtek; | ||
797 | af9015_config.ir_table_size = | ||
798 | ARRAY_SIZE(af9015_ir_table_leadtek); | ||
799 | break; | ||
800 | case USB_VID_VISIONPLUS: | ||
801 | af9015_properties[i].rc_key_map = | ||
802 | af9015_rc_keys_twinhan; | ||
803 | af9015_properties[i].rc_key_map_size = | ||
804 | ARRAY_SIZE(af9015_rc_keys_twinhan); | ||
805 | af9015_config.ir_table = | ||
806 | af9015_ir_table_twinhan; | ||
807 | af9015_config.ir_table_size = | ||
808 | ARRAY_SIZE(af9015_ir_table_twinhan); | ||
809 | break; | ||
810 | case USB_VID_KWORLD_2: | ||
811 | /* TODO: use correct rc keys */ | ||
812 | af9015_properties[i].rc_key_map = | ||
813 | af9015_rc_keys_twinhan; | ||
814 | af9015_properties[i].rc_key_map_size = | ||
815 | ARRAY_SIZE(af9015_rc_keys_twinhan); | ||
816 | af9015_config.ir_table = af9015_ir_table_kworld; | ||
817 | af9015_config.ir_table_size = | ||
818 | ARRAY_SIZE(af9015_ir_table_kworld); | ||
819 | break; | ||
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 | case USB_VID_AFATECH: | ||
824 | memset(manufacturer, 0, sizeof(manufacturer)); | ||
825 | usb_string(udev, udev->descriptor.iManufacturer, | ||
826 | manufacturer, sizeof(manufacturer)); | ||
827 | if (!strcmp("Geniatech", manufacturer)) { | ||
828 | /* iManufacturer 1 Geniatech | ||
829 | iProduct 2 AF9015 */ | ||
830 | af9015_properties[i].rc_key_map = | ||
831 | af9015_rc_keys_mygictv; | ||
832 | af9015_properties[i].rc_key_map_size = | ||
833 | ARRAY_SIZE(af9015_rc_keys_mygictv); | ||
834 | af9015_config.ir_table = | ||
835 | af9015_ir_table_mygictv; | ||
836 | af9015_config.ir_table_size = | ||
837 | ARRAY_SIZE(af9015_ir_table_mygictv); | ||
838 | } else if (!strcmp("MSI", manufacturer)) { | ||
839 | /* iManufacturer 1 MSI | ||
840 | iProduct 2 MSI K-VOX */ | ||
841 | af9015_properties[i].rc_key_map = | ||
842 | af9015_rc_keys_msi; | ||
843 | af9015_properties[i].rc_key_map_size = | ||
844 | ARRAY_SIZE(af9015_rc_keys_msi); | ||
845 | af9015_config.ir_table = | ||
846 | af9015_ir_table_msi; | ||
847 | af9015_config.ir_table_size = | ||
848 | ARRAY_SIZE(af9015_ir_table_msi); | ||
849 | } else if (udev->descriptor.idProduct == | ||
850 | cpu_to_le16(USB_PID_TREKSTOR_DVBT)) { | ||
851 | af9015_properties[i].rc_key_map = | ||
852 | af9015_rc_keys_trekstor; | ||
853 | af9015_properties[i].rc_key_map_size = | ||
854 | ARRAY_SIZE(af9015_rc_keys_trekstor); | ||
855 | af9015_config.ir_table = | ||
856 | af9015_ir_table_trekstor; | ||
857 | af9015_config.ir_table_size = | ||
858 | ARRAY_SIZE(af9015_ir_table_trekstor); | ||
859 | } | ||
860 | break; | ||
861 | case USB_VID_AVERMEDIA: | ||
862 | af9015_properties[i].rc_key_map = | ||
863 | af9015_rc_keys_avermedia; | ||
864 | af9015_properties[i].rc_key_map_size = | ||
865 | ARRAY_SIZE(af9015_rc_keys_avermedia); | ||
866 | af9015_config.ir_table = | ||
867 | af9015_ir_table_avermedia; | ||
868 | af9015_config.ir_table_size = | ||
869 | ARRAY_SIZE(af9015_ir_table_avermedia); | ||
870 | break; | ||
871 | case USB_VID_MSI_2: | ||
872 | af9015_properties[i].rc_key_map = | ||
873 | af9015_rc_keys_msi_digivox_iii; | ||
874 | af9015_properties[i].rc_key_map_size = | ||
875 | ARRAY_SIZE(af9015_rc_keys_msi_digivox_iii); | ||
876 | af9015_config.ir_table = | ||
877 | af9015_ir_table_msi_digivox_iii; | ||
878 | af9015_config.ir_table_size = | ||
879 | ARRAY_SIZE(af9015_ir_table_msi_digivox_iii); | ||
880 | break; | ||
881 | } | ||
882 | } | ||
883 | } | 884 | } |
884 | 885 | ||
885 | /* TS mode - one or two receivers */ | 886 | /* TS mode - one or two receivers */ |
@@ -1001,6 +1002,9 @@ static int af9015_read_config(struct usb_device *udev) | |||
1001 | af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO; | 1002 | af9015_af9013_config[i].gpio[1] = AF9013_GPIO_LO; |
1002 | af9015_af9013_config[i].rf_spec_inv = 1; | 1003 | af9015_af9013_config[i].rf_spec_inv = 1; |
1003 | break; | 1004 | break; |
1005 | case AF9013_TUNER_TDA18218: | ||
1006 | warn("tuner NXP TDA18218 not supported yet"); | ||
1007 | return -ENODEV; | ||
1004 | default: | 1008 | default: |
1005 | warn("tuner id:%d not supported, please report!", val); | 1009 | warn("tuner id:%d not supported, please report!", val); |
1006 | return -ENODEV; | 1010 | return -ENODEV; |
@@ -1125,11 +1129,6 @@ static int af9015_af9013_frontend_attach(struct dvb_usb_adapter *adap) | |||
1125 | 1129 | ||
1126 | deb_info("%s: init I2C\n", __func__); | 1130 | deb_info("%s: init I2C\n", __func__); |
1127 | ret = af9015_i2c_init(adap->dev); | 1131 | ret = af9015_i2c_init(adap->dev); |
1128 | |||
1129 | /* dump eeprom (debug) */ | ||
1130 | ret = af9015_eeprom_dump(adap->dev); | ||
1131 | if (ret) | ||
1132 | return ret; | ||
1133 | } else { | 1132 | } else { |
1134 | /* select I2C adapter */ | 1133 | /* select I2C adapter */ |
1135 | i2c_adap = &state->i2c_adap; | 1134 | i2c_adap = &state->i2c_adap; |
@@ -1295,6 +1294,8 @@ static struct usb_device_id af9015_usb_table[] = { | |||
1295 | /* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)}, | 1294 | /* 25 */{USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_399U_2)}, |
1296 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)}, | 1295 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_PC160_T)}, |
1297 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20)}, | 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)}, | ||
1298 | {0}, | 1299 | {0}, |
1299 | }; | 1300 | }; |
1300 | MODULE_DEVICE_TABLE(usb, af9015_usb_table); | 1301 | MODULE_DEVICE_TABLE(usb, af9015_usb_table); |
@@ -1381,7 +1382,8 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1381 | }, | 1382 | }, |
1382 | { | 1383 | { |
1383 | .name = "DigitalNow TinyTwin DVB-T Receiver", | 1384 | .name = "DigitalNow TinyTwin DVB-T Receiver", |
1384 | .cold_ids = {&af9015_usb_table[5], NULL}, | 1385 | .cold_ids = {&af9015_usb_table[5], |
1386 | &af9015_usb_table[28], NULL}, | ||
1385 | .warm_ids = {NULL}, | 1387 | .warm_ids = {NULL}, |
1386 | }, | 1388 | }, |
1387 | { | 1389 | { |
@@ -1566,7 +1568,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1566 | 1568 | ||
1567 | .i2c_algo = &af9015_i2c_algo, | 1569 | .i2c_algo = &af9015_i2c_algo, |
1568 | 1570 | ||
1569 | .num_device_descs = 6, /* max 9 */ | 1571 | .num_device_descs = 7, /* max 9 */ |
1570 | .devices = { | 1572 | .devices = { |
1571 | { | 1573 | { |
1572 | .name = "AverMedia AVerTV Volar GPS 805 (A805)", | 1574 | .name = "AverMedia AVerTV Volar GPS 805 (A805)", |
@@ -1600,6 +1602,11 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1600 | .cold_ids = {&af9015_usb_table[27], NULL}, | 1602 | .cold_ids = {&af9015_usb_table[27], NULL}, |
1601 | .warm_ids = {NULL}, | 1603 | .warm_ids = {NULL}, |
1602 | }, | 1604 | }, |
1605 | { | ||
1606 | .name = "Leadtek WinFast DTV2000DS", | ||
1607 | .cold_ids = {&af9015_usb_table[29], NULL}, | ||
1608 | .warm_ids = {NULL}, | ||
1609 | }, | ||
1603 | } | 1610 | } |
1604 | }, | 1611 | }, |
1605 | }; | 1612 | }; |