]> err.no Git - linux-2.6/blobdiff - drivers/hwmon/gl518sm.c
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6] / drivers / hwmon / gl518sm.c
index 535ad8776a689568f50ad5f1a11d422b6db80479..33e9e8a8d1cea07d3613b3d1f67d2390fcadf6ac 100644 (file)
@@ -44,7 +44,7 @@
 #include <linux/sysfs.h>
 
 /* Addresses to scan */
-static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };
+static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };
 
 /* Insmod parameters */
 I2C_CLIENT_INSMOD_2(gl518sm_r00, gl518sm_r80);
@@ -96,10 +96,10 @@ static inline u8 FAN_TO_REG(long rpm, int div)
        long rpmdiv;
        if (rpm == 0)
                return 0;
-       rpmdiv = SENSORS_LIMIT(rpm, 1, 1920000) * div;
-       return SENSORS_LIMIT((960000 + rpmdiv / 2) / rpmdiv, 1, 255);
+       rpmdiv = SENSORS_LIMIT(rpm, 1, 960000) * div;
+       return SENSORS_LIMIT((480000 + rpmdiv / 2) / rpmdiv, 1, 255);
 }
-#define FAN_FROM_REG(val,div)  ((val)==0 ? 0 : (960000/((val)*(div))))
+#define FAN_FROM_REG(val,div)  ((val)==0 ? 0 : (480000/((val)*(div))))
 
 #define IN_TO_REG(val)         (SENSORS_LIMIT((((val)+9)/19),0,255))
 #define IN_FROM_REG(val)       ((val)*19)
@@ -107,7 +107,6 @@ static inline u8 FAN_TO_REG(long rpm, int div)
 #define VDD_TO_REG(val)                (SENSORS_LIMIT((((val)*4+47)/95),0,255))
 #define VDD_FROM_REG(val)      (((val)*95+2)/4)
 
-#define DIV_TO_REG(val)                ((val)==4?2:(val)==2?1:(val)==1?0:3)
 #define DIV_FROM_REG(val)      (1 << (val))
 
 #define BEEP_MASK_TO_REG(val)  ((val) & 0x7f & data->alarm_mask)
@@ -302,9 +301,20 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
        int regvalue;
        unsigned long val = simple_strtoul(buf, NULL, 10);
 
+       switch (val) {
+       case 1: val = 0; break;
+       case 2: val = 1; break;
+       case 4: val = 2; break;
+       case 8: val = 3; break;
+       default:
+               dev_err(dev, "Invalid fan clock divider %lu, choose one "
+                       "of 1, 2, 4 or 8\n", val);
+               return -EINVAL;
+       }
+
        mutex_lock(&data->update_lock);
        regvalue = gl518_read_value(client, GL518_REG_MISC);
-       data->fan_div[nr] = DIV_TO_REG(val);
+       data->fan_div[nr] = val;
        regvalue = (regvalue & ~(0xc0 >> (2 * nr)))
                 | (data->fan_div[nr] << (6 - 2 * nr));
        gl518_write_value(client, GL518_REG_MISC, regvalue);