diff options
Diffstat (limited to 'drivers/i2c/chips/gl518sm.c')
-rw-r--r-- | drivers/i2c/chips/gl518sm.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/i2c/chips/gl518sm.c b/drivers/i2c/chips/gl518sm.c index a9c40b6f8342f..c82d6ce212055 100644 --- a/drivers/i2c/chips/gl518sm.c +++ b/drivers/i2c/chips/gl518sm.c @@ -211,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; \ } @@ -222,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; \ } @@ -255,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); @@ -270,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; } @@ -277,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); @@ -292,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; } |