X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fi2c%2Fchips%2Flm63.c;h=14cc5af03739363a010213d1061e59daed763ab9;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=73b8e8308ea246ceb8e345e267675f1b3562fce9;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/i2c/chips/lm63.c b/drivers/i2c/chips/lm63.c index 73b8e8308..14cc5af03 100644 --- a/drivers/i2c/chips/lm63.c +++ b/drivers/i2c/chips/lm63.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -190,11 +191,14 @@ static ssize_t set_fan1_low(struct device *dev, const char *buf, struct i2c_client *client = to_i2c_client(dev); struct lm63_data *data = i2c_get_clientdata(client); unsigned long val = simple_strtoul(buf, NULL, 10); + + down(&data->update_lock); data->fan1_low = FAN_TO_REG(val); i2c_smbus_write_byte_data(client, LM63_REG_TACH_LIMIT_LSB, data->fan1_low & 0xFF); i2c_smbus_write_byte_data(client, LM63_REG_TACH_LIMIT_MSB, data->fan1_low >> 8); + up(&data->update_lock); return count; } @@ -216,10 +220,12 @@ static ssize_t set_pwm1(struct device *dev, const char *buf, size_t count) return -EPERM; val = simple_strtoul(buf, NULL, 10); + down(&data->update_lock); data->pwm1_value = val <= 0 ? 0 : val >= 255 ? 2 * data->pwm1_freq : (val * data->pwm1_freq * 2 + 127) / 255; i2c_smbus_write_byte_data(client, LM63_REG_PWM_VALUE, data->pwm1_value); + up(&data->update_lock); return count; } @@ -255,8 +261,11 @@ static ssize_t set_##value(struct device *dev, const char *buf, \ struct i2c_client *client = to_i2c_client(dev); \ struct lm63_data *data = i2c_get_clientdata(client); \ long val = simple_strtol(buf, NULL, 10); \ + \ + down(&data->update_lock); \ data->value = TEMP8_TO_REG(val); \ i2c_smbus_write_byte_data(client, reg, data->value); \ + up(&data->update_lock); \ return count; \ } #define set_temp11(value, reg_msb, reg_lsb) \ @@ -266,9 +275,12 @@ static ssize_t set_##value(struct device *dev, const char *buf, \ struct i2c_client *client = to_i2c_client(dev); \ struct lm63_data *data = i2c_get_clientdata(client); \ long val = simple_strtol(buf, NULL, 10); \ + \ + down(&data->update_lock); \ data->value = TEMP11_TO_REG(val); \ i2c_smbus_write_byte_data(client, reg_msb, data->value >> 8); \ i2c_smbus_write_byte_data(client, reg_lsb, data->value & 0xff); \ + up(&data->update_lock); \ return count; \ } set_temp8(temp1_high, LM63_REG_LOCAL_HIGH); @@ -291,10 +303,14 @@ static ssize_t set_temp2_crit_hyst(struct device *dev, const char *buf, { struct i2c_client *client = to_i2c_client(dev); struct lm63_data *data = i2c_get_clientdata(client); - int hyst = TEMP8_FROM_REG(data->temp2_crit) - - simple_strtol(buf, NULL, 10); + long val = simple_strtol(buf, NULL, 10); + long hyst; + + down(&data->update_lock); + hyst = TEMP8_FROM_REG(data->temp2_crit) - val; i2c_smbus_write_byte_data(client, LM63_REG_REMOTE_TCRIT_HYST, HYST_TO_REG(hyst)); + up(&data->update_lock); return count; } @@ -464,8 +480,8 @@ static void lm63_init_client(struct i2c_client *client) (data->config & 0x04) ? "tachometer input" : "alert output"); dev_dbg(&client->dev, "PWM clock %s kHz, output frequency %u Hz\n", - (data->config_fan & 0x04) ? "1.4" : "360", - ((data->config_fan & 0x04) ? 700 : 180000) / data->pwm1_freq); + (data->config_fan & 0x08) ? "1.4" : "360", + ((data->config_fan & 0x08) ? 700 : 180000) / data->pwm1_freq); dev_dbg(&client->dev, "PWM output active %s, %s mode\n", (data->config_fan & 0x10) ? "low" : "high", (data->config_fan & 0x20) ? "manual" : "auto"); @@ -492,9 +508,7 @@ static struct lm63_data *lm63_update_device(struct device *dev) down(&data->update_lock); - if ((jiffies - data->last_updated > HZ) || - (jiffies < data->last_updated) || - !data->valid) { + if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { if (data->config & 0x04) { /* tachometer enabled */ /* order matters for fan1_input */ data->fan1_input = i2c_smbus_read_byte_data(client,