File asusfan-0.1.patch of Package asusfan

--- asusfan-0.1/cmd/main.c
+++ asusfan-0.1/cmd/main.c
@@ -38,9 +38,12 @@
   { "query", 0, 0, 'q' },
   { "temp", 1, 0, 't' },
   { "speeds", 1, 0, 'r' }, // Random short letter
+  { "debug", 0, 0, 'd' },
   { 0, 0, 0, 0 }
 };
 
+int debug = 0;
+
 int isnumber(const char* string) {
   char* temp;
   int i;
@@ -54,19 +57,22 @@
 
 int usage() {
   printf("AsusFan v%s (libasus v%s)\n\n", ASUSFAN_VERSION, LIBASUS_VERSION);
-  printf("Fan control for Asus V9999 series cards (and possibily other Asus Nvidia");
-  printf(" cards).\n\n");
+  printf("Fan control for Asus Nvidia-based graphics cards.\n\n");
   printf("Usage ./asusfan --query\n");
-  printf("Usage ./asusfan --mode=0 -speed=x\n");
+  printf("Usage ./asusfan --mode=0 --speed=x\n");
   printf("Usage ./asusfan --mode=1 [--temp=x:x:x:x] [--speeds=x:x:x:x:x]\n");
-  printf("Usage ./asusfan --mode=2\n\n");
-  printf("\t-m x, --mode=x\t0 for speed controlled, 2 for default speed\n");
-  printf("\t-s x, --speed=x\tSpeed in RPM, only useful with --mode=0\n");
+  printf("Usage ./asusfan --mode=2 --speed=x\n\n");
+  printf("\t-m x, --mode=x\t0 for fan speed mode, 1 for temperature mode,\n"
+         "\t              \t2 for manual mode\n");
+  printf("\t-s x, --speed=x\tSpeed in RPM (mode 0) or percent (mode 2)\n");
+  printf("\t               \tWARNING: Turning the fan of your graphics\n");
+  printf("\t               \tcard off or running it at low speeds can\n");
+  printf("\t               \tcause permanent damage to your hardware.\n");
   printf("\t-q, --query\tShow card vitals\n");
   printf("\t-h, --help\tThis screen\n\n");
   printf("\t-t x:x:x:x, --temp=x:x:x:x\n");
   printf("\t\tFour temperature boundaries for temperature controlled mode\n");
-  printf("\t-y x:x:x:x:, --speeds=x:x:x:x:x\n");
+  printf("\t-r x:x:x:x:, --speeds=x:x:x:x:x\n");
   printf("\t\tFive speed values, Fastest, Fast, Medium, Slow and Slowest.\n");
   printf("\t\tGiven in RPM and in the above order.\n\n");
   printf("Mode 1 defaults to:\n");
@@ -91,25 +97,13 @@
      { 3500, 3000, 2500, 2000, 1500 }
   };
 
-  int opt_speed = -1, opt_mode = -1;
-
-  if (libasus_init(0) == false) {
-    printf("ERROR: Could not initialise NVidia card\n");
-    return 1;
-  }
-
-  if ((result = libasus_detect(&i2cdev)) == false) {
-    printf("ERROR: Could not detect a suitable monitoring chip\n");
-    return 1;
-  }
+  int opt_speed = -1, opt_mode = -1, opt_query = 0;
 
   if (argc == 1) {
     return usage();
   }
 
-  libasus_create_card(&card, i2cdev, result);
-
-  while ((opt = getopt_long(argc, argv, "m:s:hq", long_options, NULL)) != -1) {
+  while ((opt = getopt_long(argc, argv, "m:s:hqtrd", long_options, NULL)) != -1) {
     switch (opt) {
       case 'm':
 	if (isnumber(optarg)) {
@@ -126,7 +120,7 @@
 	opt_speed = strtol(optarg, (char**)NULL, 10);
 	break;
       case 'q':
-	return query(card);
+        opt_query = 1;
 	break;
       case 'h':
 	return usage();
@@ -154,11 +148,28 @@
 	    return 1;
 	}
 	break;
+      case 'd':
+        debug = 1;
+        break;
       default:
 	return 1;
     }
   }
 
+  if (libasus_init(debug) == false) {
+    printf("ERROR: Could not initialise NVidia card\n");
+    return 1;
+  }
+
+  if ((result = libasus_detect(&i2cdev)) == false) {
+    printf("ERROR: Could not detect a suitable monitoring chip\n");
+    return 1;
+  }
+
+  libasus_create_card(&card, i2cdev, result);
+  
+  if (opt_query) return query(card);
+
   if ((opt_mode == 0) && (opt_speed > -1)) {
     libasus_set_gpu_fanspeed(card, opt_speed);
     libasus_set_gpu_fanmode(card, MODE_SPEED);
@@ -167,7 +178,7 @@
     libasus_set_gpu_fanmode(card, MODE_TEMP);
   } else if ((opt_mode == 2)) {
     libasus_set_gpu_fanmode(card, MODE_PWM);
-    libasus_set_gpu_pwmspeed(card, 0xff);
+    libasus_set_gpu_pwmspeed(card, opt_speed > -1 ? opt_speed : 100);
   } else {
     printf("Error: Illegal Parameter Values\n");
   }
@@ -186,10 +197,10 @@
 
   switch (libasus_get_gpu_fanmode(card)>>4) {
     case 0:
-      printf("Speed (RPM) by specified value\n");
+      printf("Fan Speed Mode\n");
       break;
     case 1:
-      printf("Temperature Controlled\n\n");
+      printf("Temperature Mode\n\n");
       libasus_get_gpu_tempctl(card, &temp_fan);
       printf("Current Settings:\n");
       printf("\tFastest: %dRPM\tBoundary 1:\t%dC\n",
@@ -204,7 +215,8 @@
 	temp_fan.speed[4]);
       break;
     case 2:
-      printf("Default Speed\n");
+      printf("Manual Mode\n\n");
+      printf("Current Fan Speed: %d%%\n",libasus_get_gpu_pwmspeed(card));
       break;
   }
   return 0;
--- asusfan-0.1/configure
+++ asusfan-0.1/configure
@@ -6202,7 +6202,7 @@
   exit 1
 fi
 gentoo_lt_version="1.5.10"
-gentoo_ltmain_version=`grep '^[:space:]*VERSION=' $ltmain | sed -e 's|^[:space:]*VERSION=||'`
+gentoo_ltmain_version=`grep '^[[:space:]]*VERSION=' $ltmain | sed -e 's|^[[:space:]]*VERSION=||'`
 if test "$gentoo_lt_version" != "$gentoo_ltmain_version"; then
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
--- asusfan-0.1/libasus/detect.c
+++ asusfan-0.1/libasus/detect.c
@@ -25,11 +25,13 @@
   for (bus = 0; bus < 3; bus++) {
     for (dev = busses[bus]->FirstDev; dev; dev = dev->NextDev) {
       s = NULL;
+      dbg_printf("I2C device at address 0x%x\n",dev->SlaveAddr);
       switch (dev->SlaveAddr) {
 	case 0x98:
 	case 0x6e:
 	case 0xa0:
 	  break;
+        case 0x5a:
 	case 0x5c:
 	  if (f75375_detect(dev)) {
 	    *card = dev;
@@ -65,6 +67,7 @@
       card->get_gpu_tempctl = f75375_get_gpu_tempctl;
       card->set_gpu_tempctl = f75375_set_gpu_tempctl;
       card->set_gpu_pwmspeed = f75375_set_gpu_pwmspeed;
+      card->get_gpu_pwmspeed = f75375_get_gpu_pwmspeed;
       return true;
       break;
     default:
--- asusfan-0.1/libasus/f75375.c
+++ asusfan-0.1/libasus/f75375.c
@@ -8,16 +8,18 @@
   xf86I2CReadByte(dev, FINTEK_VENDOR1, &nvl);
   xf86I2CReadByte(dev, FINTEK_VENDOR2, &nvh);
 
-  if (MERGE_BYTE(nvh, nvl) != 0x3419) {
+  dbg_printf("f75375 vendor ID 0x%x\n",MERGE_BYTE(nvh,nvl));
+  if (MERGE_BYTE(nvh, nvl) != 0x3419) /* Fintek */
     return 0;
-  }
 
   xf86I2CReadByte(dev, ASUS_NV40_CHIPID_H, &nvh);
   xf86I2CReadByte(dev, ASUS_NV40_CHIPID_L, &nvl);
 
-  if (MERGE_BYTE(nvh, nvl) == 0x0306) {
+  dbg_printf("f75375 chip ID 0x%x\n",MERGE_BYTE(nvh,nvl));
+  if (MERGE_BYTE(nvh, nvl) == 0x0306 ||	/* F75375 */
+      MERGE_BYTE(nvh, nvl) == 0x0204)	/* similar chip in Asus V9570TD */
     return 1;
-  }
+
   return 0;
 }								
 
@@ -115,7 +117,17 @@
   return 0;
 }
 
-int f75375_set_gpu_pwmspeed(I2CDevPtr dev, I2CByte speed) {
+int f75375_set_gpu_pwmspeed(I2CDevPtr dev, int speed) {
+  speed = (speed << 8) / 100;
+  if (speed > 255) speed = 255;
+  
   xf86I2CWriteByte(dev, F75375S_FAN1_PWM, speed);
   return 0;
 }
+
+int f75375_get_gpu_pwmspeed(I2CDevPtr dev) {
+  I2CByte mode;
+  
+  xf86I2CReadByte(dev, F75375S_FAN1_PWM, &mode);
+  return (mode*100) >> 8;
+}
--- asusfan-0.1/libasus/f75375.h
+++ asusfan-0.1/libasus/f75375.h
@@ -8,9 +8,9 @@
 #include "xf86i2c.h"
 #include "i2c.h"
 
-int debug;
+extern int debug;
 
-#define dbg_printf(x) if (debug==1) printf(x)
+#define dbg_printf(x...) if (debug==1) printf(x)
 
 #define MODE_SPEED			0x00
 #define MODE_TEMP			0x10
@@ -25,7 +25,8 @@
 int f75375_set_gpu_fanspeed(I2CDevPtr dev, int desired_rpm);
 int f75375_get_gpu_fanmode(I2CDevPtr dev);
 int f75375_set_gpu_fanmode(I2CDevPtr dev, I2CByte mode);
-int f75375_set_gpu_pwmspeed(I2CDevPtr dev, I2CByte speed);
+int f75375_set_gpu_pwmspeed(I2CDevPtr dev, int speed);
+int f75375_get_gpu_pwmspeed(I2CDevPtr dev);
 int f75375_set_gpu_tempctl(I2CDevPtr dev, fan_vtemp speeds);
 int f75375_get_gpu_tempctl(I2CDevPtr dev, fan_vtemp *speeds);
 
--- asusfan-0.1/libasus/i2c.h
+++ asusfan-0.1/libasus/i2c.h
@@ -1,3 +1,6 @@
 #include "xf86i2c.h"
 
 extern I2CDevPtr gfxmon;
+
+I2CBusPtr I2cCreateBusPtr(char *name, int bus);
+
--- asusfan-0.1/libasus/libasus.c
+++ asusfan-0.1/libasus/libasus.c
@@ -6,8 +6,8 @@
 
   /* WARNING: This function no longer detects cards for you */
 
-  if (!init_nvclock()) return false;
-  if (!set_card(0)) return false;
+  if (!init_nvclock()) { printf("1\n"); return false; }
+  if (!set_card(0)) { printf("2\n"); return false; }
   NVLockUnlock(0);    // Unlock the CRTC registers
 
   return true;
@@ -37,10 +37,14 @@
   return card.set_gpu_fanmode(card.card, mode);
 }
 
-int libasus_set_gpu_pwmspeed(libasus_card card, I2CByte speed) {
+int libasus_set_gpu_pwmspeed(libasus_card card, int speed) {
   return card.set_gpu_pwmspeed(card.card, speed);
 }
 
+int libasus_get_gpu_pwmspeed(libasus_card card) {
+  return card.get_gpu_pwmspeed(card.card);
+}
+
 int libasus_set_gpu_tempctl(libasus_card card, fan_vtemp speeds) {
   return card.set_gpu_tempctl(card.card, speeds);
 }
--- asusfan-0.1/libasus/libasus.h
+++ asusfan-0.1/libasus/libasus.h
@@ -8,9 +8,9 @@
 #define true 	1
 #define false 	0
 
-int	debug;
+extern int	debug;
 
-#define dbg_printf(x) if (debug==1) printf(x)
+#define dbg_printf(x...) if (debug==1) printf(x)
 
 #define LIBASUS_DEVICE_F75375	0x01
 
@@ -37,7 +37,8 @@
 	int	(*set_gpu_fanmode)(I2CDevPtr dev, I2CByte mode);
 	int	(*get_gpu_tempctl)(I2CDevPtr dev, fan_vtemp *speeds);
 	int	(*set_gpu_tempctl)(I2CDevPtr dev, fan_vtemp speeds);
-	int	(*set_gpu_pwmspeed)(I2CDevPtr dev, I2CByte mode);
+	int	(*set_gpu_pwmspeed)(I2CDevPtr dev, int speed);
+	int	(*get_gpu_pwmspeed)(I2CDevPtr dev);
 } libasus_card;
 
 // Chip header files here
@@ -49,7 +50,8 @@
 int libasus_set_gpu_fanspeed(libasus_card card, int desired_rpm);
 int libasus_get_gpu_fanmode(libasus_card card);
 int libasus_set_gpu_fanmode(libasus_card card, I2CByte mode);
-int libasus_set_gpu_pwmspeed(libasus_card card, I2CByte speed);
+int libasus_set_gpu_pwmspeed(libasus_card card, int speed);
+int libasus_get_gpu_pwmspeed(libasus_card card);
 int libasus_set_gpu_tempctl(libasus_card card, fan_vtemp speeds);
 int libasus_get_gpu_tempctl(libasus_card card, fan_vtemp *speeds);
 
--- asusfan-0.1/libasus/libnvidia.c
+++ asusfan-0.1/libasus/libnvidia.c
@@ -70,7 +70,12 @@
 	  dbg_printf("Found some NV40 (6800) based card!\n");
           gfxcard.arch = NV40;
 	  break;
+        case 0x340:
+          dbg_printf("Found an NV30-based card\n");
+          gfxcard.arch = NV30;
+          break;
 	default:
+	  dbg_printf("Found an unknown card (device ID 0x%x)\n",gfxcard.device_id);
 	  return 0;
       }
       gfxcard.number = 0;
openSUSE Build Service is sponsored by