summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Deucher <alex@botch2.com>2007-03-13 02:31:30 -0400
committerAlex Deucher <alex@botch2.com>2007-03-13 02:31:30 -0400
commitb53db3bc5ba7648d392dc630ef47e57fb8a0afb4 (patch)
tree77e1cb0eb96be9c5cdf4578fbd707576ed9c932b
parent7d1392be291e99fd3dde2292b82423b5f78d3a21 (diff)
fix clk calculation on older lynx chips
-rw-r--r--src/regsmi.h12
-rw-r--r--src/smi_dac.c11
-rw-r--r--src/smi_driver.c15
3 files changed, 28 insertions, 10 deletions
diff --git a/src/regsmi.h b/src/regsmi.h
index c325571..8319d5b 100644
--- a/src/regsmi.h
+++ b/src/regsmi.h
@@ -40,13 +40,13 @@ authorization from the XFree86 Project and SIlicon Motion.
/* Chip tags */
#define PCI_SMI_VENDOR_ID PCI_VENDOR_SMI
#define SMI_UNKNOWN 0
-#define SMI_LYNX PCI_CHIP_SMI910
-#define SMI_LYNXE PCI_CHIP_SMI810
-#define SMI_LYNX3D PCI_CHIP_SMI820
-#define SMI_LYNXEM PCI_CHIP_SMI710
+#define SMI_LYNX PCI_CHIP_SMI910
+#define SMI_LYNXE PCI_CHIP_SMI810
+#define SMI_LYNX3D PCI_CHIP_SMI820
+#define SMI_LYNXEM PCI_CHIP_SMI710
#define SMI_LYNXEMplus PCI_CHIP_SMI712
-#define SMI_LYNX3DM PCI_CHIP_SMI720
-#define SMI_COUGAR3DR PCI_CHIP_SMI731
+#define SMI_LYNX3DM PCI_CHIP_SMI720
+#define SMI_COUGAR3DR PCI_CHIP_SMI731
/* I/O Functions */
static __inline__ CARD8
diff --git a/src/smi_dac.c b/src/smi_dac.c
index 9fda7fa..ac73323 100644
--- a/src/smi_dac.c
+++ b/src/smi_dac.c
@@ -41,6 +41,8 @@ SMI_CommonCalcClock(int scrnIndex, long freq, int min_m, int min_n1,
int max_n1, int min_n2, int max_n2, long freq_min,
long freq_max, unsigned char *mdiv, unsigned char *ndiv)
{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ SMIPtr pSmi = SMIPTR(pScrn);
double div, diff, best_diff;
unsigned int m;
unsigned char n1, n2;
@@ -90,7 +92,14 @@ SMI_CommonCalcClock(int scrnIndex, long freq, int min_m, int min_n1,
((double)(best_m) / (double)(best_n1) / (1 << best_n2)) * BASE_FREQ,
best_m, best_n1, best_n2));
- *ndiv = best_n1 | (best_n2 << 7);
+ if (SMI_LYNX_SERIES(pSmi->Chipset)) {
+ *ndiv = best_n1 | (best_n2 << 6);
+ } else {
+ *ndiv = best_n1 | (best_n2 << 7);
+ if (freq > 120000)
+ *ndiv |= 1 << 6;
+ }
+
*mdiv = best_m;
}
diff --git a/src/smi_driver.c b/src/smi_driver.c
index 45eae6a..9b2ff4b 100644
--- a/src/smi_driver.c
+++ b/src/smi_driver.c
@@ -2563,7 +2563,7 @@ SMI_ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
if (pSmi->MCLK > 0) {
SMI_CommonCalcClock(pScrn->scrnIndex, pSmi->MCLK,
- 1, 1, 31, 0, 2,
+ 1, 1, 63, 0, 2,
pScrn->clockRanges->minClock,
pScrn->clockRanges->maxClock,
&new->SR6A, &new->SR6B);
@@ -2586,11 +2586,20 @@ SMI_ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* calculate vclk1 */
vclk = mode->Clock;
- SMI_CommonCalcClock(pScrn->scrnIndex, vclk,
- 1, 1, 31, 0, 2,
+ if (SMI_LYNX_SERIES(pSmi->Chipset)) {
+ SMI_CommonCalcClock(pScrn->scrnIndex, vclk,
+ 1, 1, 63, 0, 2,
pScrn->clockRanges->minClock,
pScrn->clockRanges->maxClock,
&new->SR6C, &new->SR6D);
+ } else {
+ SMI_CommonCalcClock(pScrn->scrnIndex, vclk,
+ 1, 1, 63, 0, 1,
+ pScrn->clockRanges->minClock,
+ pScrn->clockRanges->maxClock,
+ &new->SR6C, &new->SR6D);
+ }
+
/* use vclk1 */
new->SR68 = 0x54;