Re: Sensors in adt746x
On 28 Oct 2004 at 22h10, Colin Leroy wrote:
Hi,
> Thanks for your feedback. You're right, I missed these two points... Here's
> an updated patch that should behave more logically (ie, starting when temp
> == lim and stopping when temp < lim - 2), and removing the override case that
> isn't needed anymore.
Stupid me, I forgot the upper-bound check in previous patch. Disregard it and
use this one instead. (Not that it was important, check is done in
write_fan_speed() too, but it's not very elegant :))
--
Colin
"That's the difference between me and the rest of the world!
Happiness isn't good enough for me! I demand euphoria!"
-- Calvin
--- a/drivers/macintosh/therm_adt746x.c 2004-10-28 16:02:13.363979632 +0200
+++ b/drivers/macintosh/therm_adt746x.c 2004-10-28 22:46:50.773786448 +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,7 +71,7 @@
u8 initial_limits[3];
u8 limits[3];
int last_speed[2];
- int overriding[2];
+ int last_var[2];
};
static enum {ADT7460, ADT7467} therm_type;
@@ -211,10 +211,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;
@@ -278,43 +278,46 @@
int started = 0;
int fan_number = (therm_type == ADT7460 && i == 2);
int var = th->temps[i] - th->limits[i];
- if (var > 8) {
- if (th->overriding[fan_number] == 0)
- printk(KERN_INFO "adt746x: Limit exceeded by "
- "%d, overriding specified fan speed "
- "for %s.\n", var,
- fan_number?"GPU":"CPU");
- th->overriding[fan_number] = 1;
- 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");
+ if (var > -1) {
+ 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) {
- /* don't stop iBook fan if GPU is cold and CPU is not
+ new_speed = fan_speed + ((var-1)*step);
+
+ if (new_speed < fan_speed)
+ new_speed = fan_speed;
+ if (new_speed > 255)
+ new_speed = 255;
+
+ printk(KERN_DEBUG "adt746x: setting fans speed to %d "
+ "(limit exceeded by %d on %s) \n",
+ new_speed, var,
+ fan_number?"GPU/pwr":"CPU");
+ write_both_fan_speed(th, new_speed);
+ th->last_var[fan_number] = var;
+ } else if (var < -2) {
+ /* don't stop fan if GPU/power is cold and CPU is not
* so cold (lastvar >= -1) */
- if (therm_type == ADT7460 || lastvar < -1 || i == 1) {
+ if (i == 2 && lastvar < -1) {
if (th->last_speed[fan_number] != 0)
- printk(KERN_INFO "adt746x: Stopping %s "
- "fan.\n",
- fan_number?"GPU":"CPU");
- write_fan_speed(th, 0, fan_number);
+ printk(KERN_DEBUG "adt746x: Stopping "
+ "fans.\n");
+ write_both_fan_speed(th, 0);
}
}
lastvar = var;
- if (started && therm_type == ADT7467)
+ if (started)
return; /* we don't want to re-stop the fan
- * if CPU is heating and GPU is not */
+ * if CPU is heating and GPU/power is not */
}
}
@@ -391,7 +394,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 +427,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: