vserver 2.0 rc7
[linux-2.6.git] / drivers / i2c / chips / gl518sm.c
index c4e914b..c82d6ce 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
+#include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 
@@ -158,12 +159,6 @@ static struct i2c_driver gl518_driver = {
        .detach_client  = gl518_detach_client,
 };
 
-/*
- * Internal variables
- */
-
-static int gl518_id;
-
 /*
  * Sysfs stuff
  */
@@ -216,8 +211,11 @@ static ssize_t set_##suffix(struct device *dev, const char *buf,   \
        struct i2c_client *client = to_i2c_client(dev);                 \
        struct gl518_data *data = i2c_get_clientdata(client);           \
        long val = simple_strtol(buf, NULL, 10);                        \
+                                                                       \
+       down(&data->update_lock);                                       \
        data->value = type##_TO_REG(val);                               \
        gl518_write_value(client, reg, data->value);                    \
+       up(&data->update_lock);                                         \
        return count;                                                   \
 }
 
@@ -227,11 +225,15 @@ static ssize_t set_##suffix(struct device *dev, const char *buf,  \
 {                                                                      \
        struct i2c_client *client = to_i2c_client(dev);                 \
        struct gl518_data *data = i2c_get_clientdata(client);           \
-       int regvalue = gl518_read_value(client, reg);                   \
+       int regvalue;                                                   \
        unsigned long val = simple_strtoul(buf, NULL, 10);              \
+                                                                       \
+       down(&data->update_lock);                                       \
+       regvalue = gl518_read_value(client, reg);                       \
        data->value = type##_TO_REG(val);                               \
        regvalue = (regvalue & ~mask) | (data->value << shift);         \
        gl518_write_value(client, reg, regvalue);                       \
+       up(&data->update_lock);                                         \
        return count;                                                   \
 }
 
@@ -260,9 +262,12 @@ static ssize_t set_fan_min1(struct device *dev, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct gl518_data *data = i2c_get_clientdata(client);
-       int regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);
+       int regvalue;
+       unsigned long val = simple_strtoul(buf, NULL, 10);
 
-       data->fan_min[0] = FAN_TO_REG(simple_strtoul(buf, NULL, 10),
+       down(&data->update_lock);
+       regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);
+       data->fan_min[0] = FAN_TO_REG(val,
                DIV_FROM_REG(data->fan_div[0]));
        regvalue = (regvalue & 0x00ff) | (data->fan_min[0] << 8);
        gl518_write_value(client, GL518_REG_FAN_LIMIT, regvalue);
@@ -275,6 +280,7 @@ static ssize_t set_fan_min1(struct device *dev, const char *buf, size_t count)
        data->beep_mask &= data->alarm_mask;
        gl518_write_value(client, GL518_REG_ALARM, data->beep_mask);
 
+       up(&data->update_lock);
        return count;
 }
 
@@ -282,9 +288,12 @@ static ssize_t set_fan_min2(struct device *dev, const char *buf, size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct gl518_data *data = i2c_get_clientdata(client);
-       int regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);
+       int regvalue;
+       unsigned long val = simple_strtoul(buf, NULL, 10);
 
-       data->fan_min[1] = FAN_TO_REG(simple_strtoul(buf, NULL, 10),
+       down(&data->update_lock);
+       regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT);
+       data->fan_min[1] = FAN_TO_REG(val,
                DIV_FROM_REG(data->fan_div[1]));
        regvalue = (regvalue & 0xff00) | data->fan_min[1];
        gl518_write_value(client, GL518_REG_FAN_LIMIT, regvalue);
@@ -297,6 +306,7 @@ static ssize_t set_fan_min2(struct device *dev, const char *buf, size_t count)
        data->beep_mask &= data->alarm_mask;
        gl518_write_value(client, GL518_REG_ALARM, data->beep_mask);
 
+       up(&data->update_lock);
        return count;
 }
 
@@ -396,7 +406,6 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind)
 
        /* Fill in the remaining client fields */
        strlcpy(new_client->name, "gl518sm", I2C_NAME_SIZE);
-       new_client->id = gl518_id++;
        data->type = kind;
        data->valid = 0;
        init_MUTEX(&data->update_lock);
@@ -512,8 +521,8 @@ static struct gl518_data *gl518_update_device(struct device *dev)
 
        down(&data->update_lock);
 
-       if ((jiffies - data->last_updated > HZ + HZ / 2) ||
-           (jiffies < data->last_updated) || !data->valid) {
+       if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
+           || !data->valid) {
                dev_dbg(&client->dev, "Starting gl518 update\n");
 
                data->alarms = gl518_read_value(client, GL518_REG_INT);