[PATCH] dvb: DST: fixed tuning problem

fixed a tuning problem for cards based on the old firmware (Steffen Motzer,
Manu Abraham)

Signed-off-by: Johannes Stezenbach <js@linuxtv.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Johannes Stezenbach and committed by
Linus Torvalds
8385e46f e6ac699a

+41 -22
+38 -19
drivers/media/dvb/bt8xx/dst.c
··· 81 dprintk("%s: dst_gpio_enb error (err == %i, mask == %02x, enb == %02x)\n", __FUNCTION__, err, mask, enbb); 82 return -EREMOTEIO; 83 } 84 - 85 - msleep(1); 86 - 87 /* because complete disabling means no output, no need to do output packet */ 88 if (enbb == 0) 89 return 0; ··· 148 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 149 return -1; 150 } 151 - msleep(1); 152 - 153 if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) { 154 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 155 return -1; ··· 164 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 165 return -1; 166 } 167 - msleep(1); 168 - 169 return 0; 170 } 171 EXPORT_SYMBOL(dst_pio_enable); ··· 175 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 176 return -1; 177 } 178 179 return 0; 180 } ··· 198 dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i); 199 return 1; 200 } 201 - msleep(1); 202 } 203 if (verbose > 1) 204 dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i); ··· 243 dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__); 244 return -1; 245 } 246 return 0; 247 } 248 EXPORT_SYMBOL(dst_comm_init); ··· 331 u8 *val; 332 333 state->frequency = freq; 334 335 - // dprintk("%s: set frequency %u\n", __FUNCTION__, freq); 336 if (state->dst_type == DST_TYPE_IS_SAT) { 337 freq = freq / 1000; 338 if (freq < 950 || freq > 2150) ··· 456 if (state->dst_type == DST_TYPE_IS_TERR) { 457 return 0; 458 } 459 - // dprintk("%s: set srate %u\n", __FUNCTION__, srate); 460 srate /= 1000; 461 val = &state->tx_tuna[0]; 462 ··· 466 sval <<= 20; 467 do_div(sval, 88000); 468 symcalc = (u32) sval; 469 - // dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc); 470 val[5] = (u8) (symcalc >> 12); 471 val[6] = (u8) (symcalc >> 4); 472 val[7] = (u8) (symcalc << 4); ··· 512 printk(" 0x%x firmware version = 2", DST_TYPE_HAS_FW_2); 513 if (type_flags & DST_TYPE_HAS_FW_3) 514 printk(" 0x%x firmware version = 3", DST_TYPE_HAS_FW_3); 515 516 printk("\n"); 517 } ··· 626 .dst_type = DST_TYPE_IS_SAT, 627 .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1, 628 .dst_feature = DST_TYPE_HAS_CA 629 - }, /* unknown to vendor */ 630 631 { 632 .device_id = "DSTMCI", 633 .offset = 1, 634 .dst_type = DST_TYPE_IS_SAT, 635 - .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2, 636 .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 637 | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC 638 }, ··· 649 .device_id = "DCT-CI", 650 .offset = 1, 651 .dst_type = DST_TYPE_IS_CABLE, 652 - .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_FW_2, 653 .dst_feature = DST_TYPE_HAS_CA 654 }, 655 ··· 666 .device_id = "DTT-CI", 667 .offset = 1, 668 .dst_type = DST_TYPE_IS_TERR, 669 - .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2, 670 .dst_feature = 0 671 }, 672 ··· 792 dprintk("%s: DST Initialization Failed.\n", __FUNCTION__); 793 return -1; 794 } 795 - 796 if (dst_get_device_id(state) < 0) { 797 dprintk("%s: unknown device.\n", __FUNCTION__); 798 return -1; ··· 822 dprintk("%s: PIO Disable Failed.\n", __FUNCTION__); 823 return -1; 824 } 825 826 if (read_dst(state, &reply, GET_ACK)) { 827 if (verbose > 1) ··· 841 } 842 if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3)) 843 return 0; 844 if (!dst_wait_dst_ready(state, NO_DELAY)) 845 return -1; 846 ··· 938 if (!dst_wait_dst_ready(state, NO_DELAY)) 939 return 0; 940 941 - msleep(10); 942 - 943 if (state->type_flags & DST_TYPE_HAS_NEWTUNE) { 944 /* how to get variable length reply ???? */ 945 retval = read_dst(state, state->rx_tuna, 10); ··· 986 int retval; 987 u8 reply; 988 989 - dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags); 990 state->decode_freq = 0; 991 state->decode_lock = state->decode_strength = state->decode_snr = 0; 992 if (state->dst_type == DST_TYPE_IS_SAT) {
··· 81 dprintk("%s: dst_gpio_enb error (err == %i, mask == %02x, enb == %02x)\n", __FUNCTION__, err, mask, enbb); 82 return -EREMOTEIO; 83 } 84 + udelay(1000); 85 /* because complete disabling means no output, no need to do output packet */ 86 if (enbb == 0) 87 return 0; ··· 150 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 151 return -1; 152 } 153 + udelay(1000); 154 if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) { 155 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 156 return -1; ··· 167 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 168 return -1; 169 } 170 + udelay(1000); 171 return 0; 172 } 173 EXPORT_SYMBOL(dst_pio_enable); ··· 179 dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); 180 return -1; 181 } 182 + if (state->type_flags & DST_TYPE_HAS_FW_1) 183 + udelay(1000); 184 185 return 0; 186 } ··· 200 dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i); 201 return 1; 202 } 203 + msleep(35); 204 } 205 if (verbose > 1) 206 dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i); ··· 245 dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__); 246 return -1; 247 } 248 + if (state->type_flags & DST_TYPE_HAS_FW_1) 249 + msleep(100); 250 + else 251 + msleep(5); 252 + 253 return 0; 254 } 255 EXPORT_SYMBOL(dst_comm_init); ··· 328 u8 *val; 329 330 state->frequency = freq; 331 + if (debug > 4) 332 + dprintk("%s: set Frequency %u\n", __FUNCTION__, freq); 333 334 if (state->dst_type == DST_TYPE_IS_SAT) { 335 freq = freq / 1000; 336 if (freq < 950 || freq > 2150) ··· 452 if (state->dst_type == DST_TYPE_IS_TERR) { 453 return 0; 454 } 455 + if (debug > 4) 456 + dprintk("%s: set symrate %u\n", __FUNCTION__, srate); 457 srate /= 1000; 458 val = &state->tx_tuna[0]; 459 ··· 461 sval <<= 20; 462 do_div(sval, 88000); 463 symcalc = (u32) sval; 464 + 465 + if (debug > 4) 466 + dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc); 467 + 468 val[5] = (u8) (symcalc >> 12); 469 val[6] = (u8) (symcalc >> 4); 470 val[7] = (u8) (symcalc << 4); ··· 504 printk(" 0x%x firmware version = 2", DST_TYPE_HAS_FW_2); 505 if (type_flags & DST_TYPE_HAS_FW_3) 506 printk(" 0x%x firmware version = 3", DST_TYPE_HAS_FW_3); 507 + // if ((type_flags & DST_TYPE_HAS_FW_BUILD) && new_fw) 508 509 printk("\n"); 510 } ··· 617 .dst_type = DST_TYPE_IS_SAT, 618 .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1, 619 .dst_feature = DST_TYPE_HAS_CA 620 + }, /* An OEM board */ 621 622 { 623 .device_id = "DSTMCI", 624 .offset = 1, 625 .dst_type = DST_TYPE_IS_SAT, 626 + .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD, 627 .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 628 | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC 629 }, ··· 640 .device_id = "DCT-CI", 641 .offset = 1, 642 .dst_type = DST_TYPE_IS_CABLE, 643 + .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1 644 + | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD, 645 .dst_feature = DST_TYPE_HAS_CA 646 }, 647 ··· 656 .device_id = "DTT-CI", 657 .offset = 1, 658 .dst_type = DST_TYPE_IS_TERR, 659 + .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD, 660 .dst_feature = 0 661 }, 662 ··· 782 dprintk("%s: DST Initialization Failed.\n", __FUNCTION__); 783 return -1; 784 } 785 + msleep(100); 786 if (dst_get_device_id(state) < 0) { 787 dprintk("%s: unknown device.\n", __FUNCTION__); 788 return -1; ··· 812 dprintk("%s: PIO Disable Failed.\n", __FUNCTION__); 813 return -1; 814 } 815 + if (state->type_flags & DST_TYPE_HAS_FW_1) 816 + udelay(3000); 817 818 if (read_dst(state, &reply, GET_ACK)) { 819 if (verbose > 1) ··· 829 } 830 if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3)) 831 return 0; 832 + 833 + // udelay(3000); 834 + if (state->type_flags & DST_TYPE_HAS_FW_1) 835 + udelay(3000); 836 + else 837 + udelay(2000); 838 + 839 if (!dst_wait_dst_ready(state, NO_DELAY)) 840 return -1; 841 ··· 919 if (!dst_wait_dst_ready(state, NO_DELAY)) 920 return 0; 921 922 if (state->type_flags & DST_TYPE_HAS_NEWTUNE) { 923 /* how to get variable length reply ???? */ 924 retval = read_dst(state, state->rx_tuna, 10); ··· 969 int retval; 970 u8 reply; 971 972 + if (debug > 4) 973 + dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags); 974 + 975 state->decode_freq = 0; 976 state->decode_lock = state->decode_strength = state->decode_snr = 0; 977 if (state->dst_type == DST_TYPE_IS_SAT) {
+3 -3
drivers/media/dvb/bt8xx/dst_common.h
··· 46 #define DST_TYPE_HAS_FW_1 8 47 #define DST_TYPE_HAS_FW_2 16 48 #define DST_TYPE_HAS_FW_3 32 49 - 50 51 52 /* Card capability list */ ··· 117 char *device_id; 118 int offset; 119 u8 dst_type; 120 - u32 type_flags; 121 - u8 dst_feature; 122 }; 123 124
··· 46 #define DST_TYPE_HAS_FW_1 8 47 #define DST_TYPE_HAS_FW_2 16 48 #define DST_TYPE_HAS_FW_3 32 49 + #define DST_TYPE_HAS_FW_BUILD 64 50 51 52 /* Card capability list */ ··· 117 char *device_id; 118 int offset; 119 u8 dst_type; 120 + u64 type_flags; 121 + u64 dst_feature; 122 }; 123 124