[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: powerbook fan behaviour, therm_adt7467



On 26 Oct 2004 at 21h10, Colin Leroy wrote:

Hi, 

> I'll see if I can adapt this to have proper hysteresis without too
> much hassles, and if I can, will put it in.

I think I'll send this. It doesn't add any parameter, but makes the fan
speed change gradual (from specified fan speed, which is now 64 by
default, to 255, by increments of (255-fan_speed) / 7.

Hysteresis control is done simply by changing fan speed if the variation
since last speed change is greater than two degrees. What do you think?

(You may have to apply the patch by hand, it's against latest version).

-- 
Colin
  http://dudusdl.sf.net/ : a free Puzzle Bubble clone
--- drivers/macintosh/therm_adt746x.c.orig	2004-10-26 22:44:18.342932456 +0200
+++ drivers/macintosh/therm_adt746x.c	2004-10-26 22:51:13.449826616 +0200
@@ -61,8 +61,8 @@
 		 "by N degrees.");
 
 MODULE_PARM(fan_speed,"i");
-MODULE_PARM_DESC(fan_speed,"Specify fan speed (0-255) when lim < temp < lim+8 "
-		 "(default 128)");
+MODULE_PARM_DESC(fan_speed,"Specify starting fan speed (0-255) "
+		 "(default 64)");
 
 struct thermostat {
 	struct i2c_client	clt;
@@ -71,6 +71,7 @@
 	u8			initial_limits[3];
 	u8			limits[3];
 	int			last_speed[2];
+	int			last_var[2];
 	int			overriding[2];
 };
 
@@ -211,10 +212,10 @@
 	
 	if (th->last_speed[fan] != speed) {
 		if (speed == -1)
-			printk(KERN_INFO "adt746x: Setting speed to automatic "
+			printk(KERN_DEBUG "adt746x: Setting speed to automatic "
 				"for %s fan.\n", fan?"GPU":"CPU");
 		else
-			printk(KERN_INFO "adt746x: Setting speed to %d "
+			printk(KERN_DEBUG "adt746x: Setting speed to %d "
 				"for %s fan.\n", speed, fan?"GPU":"CPU");
 	} else
 		return;
@@ -280,30 +281,39 @@
 		int var = th->temps[i] - th->limits[i];
 		if (var > 8) {
 			if (th->overriding[fan_number] == 0)
-				printk(KERN_INFO "adt746x: Limit exceeded by "
+				printk(KERN_DEBUG "adt746x: Limit exceeded by "
 					"%d, overriding specified fan speed "
 					"for %s.\n", var, 
 					fan_number?"GPU":"CPU");
 
 			th->overriding[fan_number] = 1;
+			th->last_var[fan_number] = var;
 			write_fan_speed(th, 255, fan_number);
 			started = 1;
-		} else if ((!th->overriding[fan_number] || var < 6) && var > 0) {
-			if (th->overriding[fan_number] == 1)
-				printk(KERN_INFO "adt746x: Limit exceeded by "
-					"%d, setting speed to specified "
-					"for %s.\n", var, 
-					fan_number?"GPU":"CPU");
-
+		} else if (var > -2) {
+			int step = (255 - fan_speed) / 7;
+			int new_speed = 0;
+
+			/* hysteresis : change fan speed only if variation is
+			 * more than two degrees */
+			if (var > 6 || abs(var - th->last_var[fan_number]) < 2)
+				continue;
+			
 			th->overriding[fan_number] = 0;
-			write_fan_speed(th, fan_speed, fan_number);
 			started = 1;
-		} else if (var < -1) {
+			new_speed = fan_speed + ((var-1)*step);
+			printk(KERN_DEBUG "adt746x: setting %s fan speed to %d "
+					 "(limit exceeded by %d) \n",
+					fan_number?"GPU":"CPU",
+					new_speed, var);
+			write_fan_speed(th, new_speed, fan_number);
+			th->last_var[fan_number] = var;
+		} else {
 			/* don't stop iBook fan if GPU is cold and CPU is not
 			 * so cold (lastvar >= -1) */
 			if (therm_type == ADT7460 || lastvar < -1 || i == 1) {
 				if (th->last_speed[fan_number] != 0)
-					printk(KERN_INFO "adt746x: Stopping %s "
+					printk(KERN_DEBUG "adt746x: Stopping %s "
 						"fan.\n", 
 						fan_number?"GPU":"CPU");
 				write_fan_speed(th, 0, fan_number);
@@ -391,7 +401,7 @@
 
 	/* force manual control to start the fan quieter */
 	if (fan_speed == -1)
-		fan_speed=128;
+		fan_speed=64;
 	
 	if(therm_type == ADT7460) {
 		printk(KERN_INFO "adt746x: ADT7460 initializing\n");
@@ -424,7 +434,9 @@
 	/* be sure to really write fan speed the first time */
 	th->last_speed[0] = -2;
 	th->last_speed[1] = -2;
-	
+	th->last_var[0] = -80;
+	th->last_var[1] = -80;
+
 	if (fan_speed != -1) {
 		/* manual mode, stop fans */
 		write_both_fan_speed(th, 0);

Reply to: