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