tridentfb: improve clock setting accuracy
PATCH 1/1 tridentfb: improve clock setting accuracy
From: Krzysztof Helt <[email protected]>
This patch improves clock calculation precision (to kHz from MHz) and removes parameter field vclk from the tridentfb_par structure.
---
If the patch below is mangled, another copy is attached.
diff -urp linux-old/drivers/video/tridentfb.clinux-pc/drivers/video/tridentfb.c
--- linux-old/drivers/video/tridentfb.c 2008-05-01 11:19:02.000000000
+0200
+++ linux-pc/drivers/video/tridentfb.c 2008-05-01 14:28:19.000000000 +0200
@@ -27,7 +27,6 @@
#define VERSION "0.7.8-NEWAPI"
struct tridentfb_par {
- int vclk; /* in MHz */
void __iomem *io_virt; /* iospace virtual memory address */
};
@@ -669,27 +668,26 @@ static void set_screen_start(int base)
(read3X4(CRTHiOrd) & 0xF8) | ((base & 0xE0000) >> 17));
}
-/* Use 20.12 fixed-point for NTSC value and frequency calculation */ -#define calc_freq(n, m, k) ( ((unsigned long)0xE517 * (n + 8) / ((m +
2) * (1 << k))) >> 12 )
-
/* Set dotclock frequency */
-static void set_vclk(int freq)
+static void set_vclk(unsigned long freq)
{
int m, n, k;
- int f, fi, d, di;
+ unsigned long f, fi, d, di;
unsigned char lo = 0, hi = 0;
- d = 20;
+ d = 20000;
for (k = 2; k >= 0; k--)
for (m = 0; m < 63; m++)
for (n = 0; n < 128; n++) {
- fi = calc_freq(n, m, k);
+ fi = ((14318l * (n + 8)) / (m + 2)) >> k;
if ((di = abs(fi - freq)) < d) {
d = di;
f = fi;
lo = n;
hi = (k << 6) | m;
}
+ if (fi > freq)
+ break;
}
if (chip3D) {
write3C4(ClockHigh, hi);
@@ -888,6 +886,8 @@ static int tridentfb_set_par(struct fb_i
struct fb_var_screeninfo *var = &info->var; int bpp = var->bits_per_pixel;
unsigned char tmp;
+ unsigned long vclk;
+
debug("enter\n");
hdispend = var->xres / 8 - 1;
hsyncstart = (var->xres + var->right_margin) / 8;
@@ -1015,11 +1015,11 @@ static int tridentfb_set_par(struct fb_i
write3X4(Performance, 0x92);
write3X4(PCIReg, 0x07); /* MMIO & PCI read and write burst enable */
- /* convert from picoseconds to MHz */
- par->vclk = 1000000 / info->var.pixclock;
+ /* convert from picoseconds to kHz */
+ vclk = PICOS2KHZ(info->var.pixclock);
if (bpp == 32)
- par->vclk *= 2;
- set_vclk(par->vclk);
+ vclk *= 2;
+ set_vclk(vclk);
write3C4(0, 3);
write3C4(1, 1); /* set char clock 8 dots wide */
----------------------------------------------------
Nigdy nie spojrzały sobie prosto w oczy.
Nigdy nie spędziły osobno nawet jednej chwili. Siostry. Wspaniała opowieść o byciu naprawdę razem!
http://klik.wp.pl/?adr=http%3A%2F%2Fcorto.www.wp.pl%2Fas%2Fsiostry.html&sid=336
From: Krzysztof Helt <[email protected]>
This patch improves clock calculation precision (to kHz from MHz) and removes parameter field vclk from the tridentfb_par structure.
drivers/video/tridentfb.c +12 -12
@@ -27,7 +27,6 @@#define VERSION "0.7.8-NEWAPI"struct tridentfb_par { -int vclk;/* in MHz */ void __iomem *io_virt;/* iospace virtual memory address */ };
@@ -669,27 +668,26 @@ static void set_screen_start(int base) (read3X4(CRTHiOrd) & 0xF8) | ((base & 0xE0000) >> 17)); } -/* Use 20.12 fixed-point for NTSC value and frequency calculation */ -#define calc_freq (n, m, k) ( ((unsigned long)0xE517 * (n + 8) / ((m + 2) * (1 << k))) >> 12 ) -/* Set dotclock frequency */ -static void set_vclk (int freq) +static void set_vclk (unsigned long freq) {int m, n, k; -int f, fi, d, di; +unsigned long f, fi, d, di;unsigned char lo =0 , hi =0 ; - d =20 ; + d =20000 ;for (k =2 ; k >=0 ; k--)for (m =0 ; m <63 ; m++)for (n =0 ; n <128 ; n++) { - fi =calc_freq (n, m, k); + fi = ((14318l * (n +8 )) / (m +2 )) >> k;if ((di =abs (fi - freq)) < d) { d = di; f = fi; lo = n; hi = (k <<6 ) | m; } +if (fi > freq) +break ; }if (chip3D) {write3C4 (ClockHigh, hi);
@@ -888,6 +886,8 @@ static int tridentfb_set_par(struct fb_istruct fb_var_screeninfo *var = &info->var;int bpp = var->bits_per_pixel;unsigned char tmp; +unsigned long vclk; +debug ("enter\n" ); hdispend = var->xres /8 -1 ; hsyncstart = (var->xres + var->right_margin) /8 ;
@@ -1015,11 +1015,11 @@ static int tridentfb_set_par(struct fb_iwrite3X4 (Performance,0x92 );write3X4 (PCIReg,0x07 );/* MMIO & PCI read and write burst enable */ -/* convert from picoseconds to MHz */ - par->vclk =1000000 / info->var.pixclock; +/* convert from picoseconds to kHz */ + vclk =PICOS2KHZ (info->var.pixclock);if (bpp ==32 ) - par->vclk *=2 ; -set_vclk (par->vclk); + vclk *=2 ; +set_vclk (vclk);write3C4 (0 ,3 );write3C4 (1 ,1 );/* set char clock 8 dots wide */
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Linux-fbdev-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel