tridentfb: improve clock setting accuracy

Improve clock calculation precision (to kHz from MHz) and removes parameter
field vclk from the tridentfb_par structure.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Krzysztof Helt and committed by
Linus Torvalds
3f275ea3 6fb48823

+12 -12
+12 -12
drivers/video/tridentfb.c
··· 27 27 #define VERSION "0.7.8-NEWAPI" 28 28 29 29 struct tridentfb_par { 30 - int vclk; /* in MHz */ 31 30 void __iomem *io_virt; /* iospace virtual memory address */ 32 31 }; 33 32 ··· 668 669 (read3X4(CRTHiOrd) & 0xF8) | ((base & 0xE0000) >> 17)); 669 670 } 670 671 671 - /* Use 20.12 fixed-point for NTSC value and frequency calculation */ 672 - #define calc_freq(n, m, k) ( ((unsigned long)0xE517 * (n + 8) / ((m + 2) * (1 << k))) >> 12 ) 673 - 674 672 /* Set dotclock frequency */ 675 - static void set_vclk(int freq) 673 + static void set_vclk(unsigned long freq) 676 674 { 677 675 int m, n, k; 678 - int f, fi, d, di; 676 + unsigned long f, fi, d, di; 679 677 unsigned char lo = 0, hi = 0; 680 678 681 - d = 20; 679 + d = 20000; 682 680 for (k = 2; k >= 0; k--) 683 681 for (m = 0; m < 63; m++) 684 682 for (n = 0; n < 128; n++) { 685 - fi = calc_freq(n, m, k); 683 + fi = ((14318l * (n + 8)) / (m + 2)) >> k; 686 684 if ((di = abs(fi - freq)) < d) { 687 685 d = di; 688 686 f = fi; 689 687 lo = n; 690 688 hi = (k << 6) | m; 691 689 } 690 + if (fi > freq) 691 + break; 692 692 } 693 693 if (chip3D) { 694 694 write3C4(ClockHigh, hi); ··· 886 888 struct fb_var_screeninfo *var = &info->var; 887 889 int bpp = var->bits_per_pixel; 888 890 unsigned char tmp; 891 + unsigned long vclk; 892 + 889 893 debug("enter\n"); 890 894 hdispend = var->xres / 8 - 1; 891 895 hsyncstart = (var->xres + var->right_margin) / 8; ··· 1014 1014 write3X4(Performance, 0x92); 1015 1015 write3X4(PCIReg, 0x07); /* MMIO & PCI read and write burst enable */ 1016 1016 1017 - /* convert from picoseconds to MHz */ 1018 - par->vclk = 1000000 / info->var.pixclock; 1017 + /* convert from picoseconds to kHz */ 1018 + vclk = PICOS2KHZ(info->var.pixclock); 1019 1019 if (bpp == 32) 1020 - par->vclk *= 2; 1021 - set_vclk(par->vclk); 1020 + vclk *= 2; 1021 + set_vclk(vclk); 1022 1022 1023 1023 write3C4(0, 3); 1024 1024 write3C4(1, 1); /* set char clock 8 dots wide */