From: Andi Kleen <ak@muc.de>

Here's the matching patch from the SuSE 2.4 tree which also compiles with
soft-float.  No i haven't even checked if it applies to 2.6.  But maybe it
will help somebody fix the 2.6 driver.



---

 25-akpm/drivers/video/sis/init.c |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)

diff -puN drivers/video/sis/init.c~sis-DRM-floating-point-removal drivers/video/sis/init.c
--- 25/drivers/video/sis/init.c~sis-DRM-floating-point-removal	Fri Jan  9 13:22:47 2004
+++ 25-akpm/drivers/video/sis/init.c	Fri Jan  9 13:22:47 2004
@@ -5165,7 +5165,8 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
    unsigned short HRE, HBE, HRS, HBS, HDE, HT;
    unsigned char  sr_data, cr_data, cr_data2, cr_data3;
    unsigned char  sr2b, sr2c;
-   float          num, denum, postscalar, divider;
+   //float          num, denum, postscalar, divider;
+   unsigned int	  num, denum, postscalar, divider;
    int            A, B, C, D, E, F, temp, i, j, index, vclkindex;
    DisplayModePtr new = NULL, current = NULL, first = NULL, backup = NULL;
 
@@ -5230,19 +5231,19 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
       sr2b = pSiS->SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
       sr2c = pSiS->SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
 
-      divider = (sr2b & 0x80) ? 2.0 : 1.0;
+      divider = (sr2b & 0x80) ? 2 : 1;
       postscalar = (sr2c & 0x80) ?
-              ( (((sr2c >> 5) & 0x03) == 0x02) ? 6.0 : 8.0) : (((sr2c >> 5) & 0x03) + 1.0);
-      num = (sr2b & 0x7f) + 1.0;
-      denum = (sr2c & 0x1f) + 1.0;
+              ( (((sr2c >> 5) & 0x03) == 0x02) ? 6 : 8) : (((sr2c >> 5) & 0x03) + 1);
+      num = (sr2b & 0x7f) + 1;
+      denum = (sr2c & 0x1f) + 1;
       
 #ifdef TWDEBUG
       xf86DrvMsg(0, X_INFO, "------------\n");
-      xf86DrvMsg(0, X_INFO, "sr2b: %x sr2c %x div %f ps %f num %f denum %f\n",
+      xf86DrvMsg(0, X_INFO, "sr2b: %x sr2c %x div %i ps %i num %i denum %i\n",
          sr2b, sr2c, divider, postscalar, num, denum);
 #endif
 
-      current->Clock = (int)(14318 * (divider / postscalar) * (num / denum));
+      current->Clock = (int)(14318 * divider / postscalar * num / denum);
 
       sr_data = pSiS->SiS_Pr->SiS_CRT1Table[index].CR[14];
 	/* inSISIDXREG(SISSR, 0x0b, sr_data); */

_