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