aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/tridentfb.c
diff options
context:
space:
mode:
authorKrzysztof Helt <krzysztof.h1@wp.pl>2008-07-24 00:30:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-24 13:47:35 -0400
commit6bdf1035602abf0564d24a7447eea1c149c4bcb1 (patch)
treeb1bd248dd77804f6c9f29040b89f640f477a5ad3 /drivers/video/tridentfb.c
parentc1724fecabfed504a4cfb87319ad3b9d3a8baa92 (diff)
tridentfb: fix clock settings for older Trident 96XX chips
The Xorg code shows that Trident models 9660, 9680 and 9682 require a different clock setting method. Add the second clock setting method for older models. Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video/tridentfb.c')
-rw-r--r--drivers/video/tridentfb.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c
index f3153a82f926..8ee4261abf3b 100644
--- a/drivers/video/tridentfb.c
+++ b/drivers/video/tridentfb.c
@@ -85,6 +85,11 @@ MODULE_PARM_DESC(fp, "Define if flatpanel is connected");
85module_param(crt, int, 0); 85module_param(crt, int, 0);
86MODULE_PARM_DESC(crt, "Define if CRT is connected"); 86MODULE_PARM_DESC(crt, "Define if CRT is connected");
87 87
88static int is_oldclock(int id)
89{
90 return (id == TGUI9660);
91}
92
88static int is_blade(int id) 93static int is_blade(int id)
89{ 94{
90 return (id == BLADE3D) || 95 return (id == BLADE3D) ||
@@ -659,23 +664,33 @@ static void set_screen_start(struct tridentfb_par *par, int base)
659static void set_vclk(struct tridentfb_par *par, unsigned long freq) 664static void set_vclk(struct tridentfb_par *par, unsigned long freq)
660{ 665{
661 int m, n, k; 666 int m, n, k;
662 unsigned long f, fi, d, di; 667 unsigned long fi, d, di;
663 unsigned char lo = 0, hi = 0; 668 unsigned char best_m = 0, best_n = 0, best_k = 0;
669 unsigned char hi, lo;
664 670
665 d = 20000; 671 d = 20000;
666 for (k = 2; k >= 0; k--) 672 for (k = 1; k >= 0; k--)
667 for (m = 0; m < 63; m++) 673 for (m = 0; m < 32; m++)
668 for (n = 0; n < 128; n++) { 674 for (n = 0; n < 122; n++) {
669 fi = ((14318l * (n + 8)) / (m + 2)) >> k; 675 fi = ((14318l * (n + 8)) / (m + 2)) >> k;
670 if ((di = abs(fi - freq)) < d) { 676 if ((di = abs(fi - freq)) < d) {
671 d = di; 677 d = di;
672 f = fi; 678 best_n = n;
673 lo = n; 679 best_m = m;
674 hi = (k << 6) | m; 680 best_k = k;
675 } 681 }
676 if (fi > freq) 682 if (fi > freq)
677 break; 683 break;
678 } 684 }
685
686 if (is_oldclock(par->chip_id)) {
687 lo = best_n | (best_m << 7);
688 hi = (best_m >> 1) | (best_k << 4);
689 } else {
690 lo = best_n;
691 hi = best_m | (best_k << 6);
692 }
693
679 if (is3Dchip(par->chip_id)) { 694 if (is3Dchip(par->chip_id)) {
680 vga_mm_wseq(par->io_virt, ClockHigh, hi); 695 vga_mm_wseq(par->io_virt, ClockHigh, hi);
681 vga_mm_wseq(par->io_virt, ClockLow, lo); 696 vga_mm_wseq(par->io_virt, ClockLow, lo);