vserver 2.0 rc7
[linux-2.6.git] / drivers / i2c / chips / asb100.c
index 7c6d896..7f89900 100644 (file)
     asb100     7       3       1       4       0x31    0x0694  yes     no
 */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/ioport.h>
-#include <linux/types.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
 #include <linux/init.h>
-#include <asm/errno.h>
-#include <asm/io.h>
 #include "lm75.h"
 
 /*
@@ -251,9 +246,12 @@ static ssize_t set_in_##reg(struct device *dev, const char *buf, \
        struct i2c_client *client = to_i2c_client(dev); \
        struct asb100_data *data = i2c_get_clientdata(client); \
        unsigned long val = simple_strtoul(buf, NULL, 10); \
+ \
+       down(&data->update_lock); \
        data->in_##reg[nr] = IN_TO_REG(val); \
        asb100_write_value(client, ASB100_REG_IN_##REG(nr), \
                data->in_##reg[nr]); \
+       up(&data->update_lock); \
        return count; \
 }
 
@@ -334,8 +332,11 @@ static ssize_t set_fan_min(struct device *dev, const char *buf,
        struct i2c_client *client = to_i2c_client(dev);
        struct asb100_data *data = i2c_get_clientdata(client);
        u32 val = simple_strtoul(buf, NULL, 10);
+
+       down(&data->update_lock);
        data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
        asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]);
+       up(&data->update_lock);
        return count;
 }
 
@@ -348,11 +349,14 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct asb100_data *data = i2c_get_clientdata(client);
-       unsigned long min = FAN_FROM_REG(data->fan_min[nr],
-                       DIV_FROM_REG(data->fan_div[nr]));
+       unsigned long min;
        unsigned long val = simple_strtoul(buf, NULL, 10);
        int reg;
        
+       down(&data->update_lock);
+
+       min = FAN_FROM_REG(data->fan_min[nr],
+                       DIV_FROM_REG(data->fan_div[nr]));
        data->fan_div[nr] = DIV_TO_REG(val);
 
        switch(nr) {
@@ -378,6 +382,9 @@ static ssize_t set_fan_div(struct device *dev, const char *buf,
        data->fan_min[nr] =
                FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
        asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]);
+
+       up(&data->update_lock);
+
        return count;
 }
 
@@ -455,6 +462,8 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \
        struct i2c_client *client = to_i2c_client(dev); \
        struct asb100_data *data = i2c_get_clientdata(client); \
        unsigned long val = simple_strtoul(buf, NULL, 10); \
+ \
+       down(&data->update_lock); \
        switch (nr) { \
        case 1: case 2: \
                data->reg[nr] = LM75_TEMP_TO_REG(val); \
@@ -465,6 +474,7 @@ static ssize_t set_##reg(struct device *dev, const char *buf, \
        } \
        asb100_write_value(client, ASB100_REG_TEMP_##REG(nr+1), \
                        data->reg[nr]); \
+       up(&data->update_lock); \
        return count; \
 }
 
@@ -565,9 +575,12 @@ static ssize_t set_pwm1(struct device *dev, const char *buf, size_t count)
        struct i2c_client *client = to_i2c_client(dev);
        struct asb100_data *data = i2c_get_clientdata(client);
        unsigned long val = simple_strtoul(buf, NULL, 10);
+
+       down(&data->update_lock);
        data->pwm &= 0x80; /* keep the enable bit */
        data->pwm |= (0x0f & ASB100_PWM_TO_REG(val));
        asb100_write_value(client, ASB100_REG_PWM1, data->pwm);
+       up(&data->update_lock);
        return count;
 }
 
@@ -583,9 +596,12 @@ static ssize_t set_pwm_enable1(struct device *dev, const char *buf,
        struct i2c_client *client = to_i2c_client(dev);
        struct asb100_data *data = i2c_get_clientdata(client);
        unsigned long val = simple_strtoul(buf, NULL, 10);
+
+       down(&data->update_lock);
        data->pwm &= 0x0f; /* keep the duty cycle bits */
        data->pwm |= (val ? 0x80 : 0x00);
        asb100_write_value(client, ASB100_REG_PWM1, data->pwm);
+       up(&data->update_lock);
        return count;
 }
 
@@ -970,8 +986,8 @@ static struct asb100_data *asb100_update_device(struct device *dev)
 
        down(&data->update_lock);
 
-       if (time_after(jiffies - data->last_updated, (unsigned long)(HZ+HZ/2))
-               || time_before(jiffies, data->last_updated) || !data->valid) {
+       if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
+               || !data->valid) {
 
                dev_dbg(&client->dev, "starting device update...\n");