diff options
Diffstat (limited to 'drivers/hwmon/gl518sm.c')
-rw-r--r-- | drivers/hwmon/gl518sm.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/hwmon/gl518sm.c b/drivers/hwmon/gl518sm.c index 9e685e3a3bc9..6606aabdb49d 100644 --- a/drivers/hwmon/gl518sm.c +++ b/drivers/hwmon/gl518sm.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/i2c.h> | 43 | #include <linux/i2c.h> |
44 | #include <linux/hwmon.h> | 44 | #include <linux/hwmon.h> |
45 | #include <linux/err.h> | 45 | #include <linux/err.h> |
46 | #include <linux/mutex.h> | ||
46 | 47 | ||
47 | /* Addresses to scan */ | 48 | /* Addresses to scan */ |
48 | static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; | 49 | static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; |
@@ -120,7 +121,7 @@ struct gl518_data { | |||
120 | struct class_device *class_dev; | 121 | struct class_device *class_dev; |
121 | enum chips type; | 122 | enum chips type; |
122 | 123 | ||
123 | struct semaphore update_lock; | 124 | struct mutex update_lock; |
124 | char valid; /* !=0 if following fields are valid */ | 125 | char valid; /* !=0 if following fields are valid */ |
125 | unsigned long last_updated; /* In jiffies */ | 126 | unsigned long last_updated; /* In jiffies */ |
126 | 127 | ||
@@ -212,10 +213,10 @@ static ssize_t set_##suffix(struct device *dev, struct device_attribute *attr, c | |||
212 | struct gl518_data *data = i2c_get_clientdata(client); \ | 213 | struct gl518_data *data = i2c_get_clientdata(client); \ |
213 | long val = simple_strtol(buf, NULL, 10); \ | 214 | long val = simple_strtol(buf, NULL, 10); \ |
214 | \ | 215 | \ |
215 | down(&data->update_lock); \ | 216 | mutex_lock(&data->update_lock); \ |
216 | data->value = type##_TO_REG(val); \ | 217 | data->value = type##_TO_REG(val); \ |
217 | gl518_write_value(client, reg, data->value); \ | 218 | gl518_write_value(client, reg, data->value); \ |
218 | up(&data->update_lock); \ | 219 | mutex_unlock(&data->update_lock); \ |
219 | return count; \ | 220 | return count; \ |
220 | } | 221 | } |
221 | 222 | ||
@@ -228,12 +229,12 @@ static ssize_t set_##suffix(struct device *dev, struct device_attribute *attr, c | |||
228 | int regvalue; \ | 229 | int regvalue; \ |
229 | unsigned long val = simple_strtoul(buf, NULL, 10); \ | 230 | unsigned long val = simple_strtoul(buf, NULL, 10); \ |
230 | \ | 231 | \ |
231 | down(&data->update_lock); \ | 232 | mutex_lock(&data->update_lock); \ |
232 | regvalue = gl518_read_value(client, reg); \ | 233 | regvalue = gl518_read_value(client, reg); \ |
233 | data->value = type##_TO_REG(val); \ | 234 | data->value = type##_TO_REG(val); \ |
234 | regvalue = (regvalue & ~mask) | (data->value << shift); \ | 235 | regvalue = (regvalue & ~mask) | (data->value << shift); \ |
235 | gl518_write_value(client, reg, regvalue); \ | 236 | gl518_write_value(client, reg, regvalue); \ |
236 | up(&data->update_lock); \ | 237 | mutex_unlock(&data->update_lock); \ |
237 | return count; \ | 238 | return count; \ |
238 | } | 239 | } |
239 | 240 | ||
@@ -265,7 +266,7 @@ static ssize_t set_fan_min1(struct device *dev, struct device_attribute *attr, c | |||
265 | int regvalue; | 266 | int regvalue; |
266 | unsigned long val = simple_strtoul(buf, NULL, 10); | 267 | unsigned long val = simple_strtoul(buf, NULL, 10); |
267 | 268 | ||
268 | down(&data->update_lock); | 269 | mutex_lock(&data->update_lock); |
269 | regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); | 270 | regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); |
270 | data->fan_min[0] = FAN_TO_REG(val, | 271 | data->fan_min[0] = FAN_TO_REG(val, |
271 | DIV_FROM_REG(data->fan_div[0])); | 272 | DIV_FROM_REG(data->fan_div[0])); |
@@ -280,7 +281,7 @@ static ssize_t set_fan_min1(struct device *dev, struct device_attribute *attr, c | |||
280 | data->beep_mask &= data->alarm_mask; | 281 | data->beep_mask &= data->alarm_mask; |
281 | gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); | 282 | gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); |
282 | 283 | ||
283 | up(&data->update_lock); | 284 | mutex_unlock(&data->update_lock); |
284 | return count; | 285 | return count; |
285 | } | 286 | } |
286 | 287 | ||
@@ -291,7 +292,7 @@ static ssize_t set_fan_min2(struct device *dev, struct device_attribute *attr, c | |||
291 | int regvalue; | 292 | int regvalue; |
292 | unsigned long val = simple_strtoul(buf, NULL, 10); | 293 | unsigned long val = simple_strtoul(buf, NULL, 10); |
293 | 294 | ||
294 | down(&data->update_lock); | 295 | mutex_lock(&data->update_lock); |
295 | regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); | 296 | regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); |
296 | data->fan_min[1] = FAN_TO_REG(val, | 297 | data->fan_min[1] = FAN_TO_REG(val, |
297 | DIV_FROM_REG(data->fan_div[1])); | 298 | DIV_FROM_REG(data->fan_div[1])); |
@@ -306,7 +307,7 @@ static ssize_t set_fan_min2(struct device *dev, struct device_attribute *attr, c | |||
306 | data->beep_mask &= data->alarm_mask; | 307 | data->beep_mask &= data->alarm_mask; |
307 | gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); | 308 | gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); |
308 | 309 | ||
309 | up(&data->update_lock); | 310 | mutex_unlock(&data->update_lock); |
310 | return count; | 311 | return count; |
311 | } | 312 | } |
312 | 313 | ||
@@ -407,7 +408,7 @@ static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) | |||
407 | strlcpy(new_client->name, "gl518sm", I2C_NAME_SIZE); | 408 | strlcpy(new_client->name, "gl518sm", I2C_NAME_SIZE); |
408 | data->type = kind; | 409 | data->type = kind; |
409 | data->valid = 0; | 410 | data->valid = 0; |
410 | init_MUTEX(&data->update_lock); | 411 | mutex_init(&data->update_lock); |
411 | 412 | ||
412 | /* Tell the I2C layer a new client has arrived */ | 413 | /* Tell the I2C layer a new client has arrived */ |
413 | if ((err = i2c_attach_client(new_client))) | 414 | if ((err = i2c_attach_client(new_client))) |
@@ -525,7 +526,7 @@ static struct gl518_data *gl518_update_device(struct device *dev) | |||
525 | struct gl518_data *data = i2c_get_clientdata(client); | 526 | struct gl518_data *data = i2c_get_clientdata(client); |
526 | int val; | 527 | int val; |
527 | 528 | ||
528 | down(&data->update_lock); | 529 | mutex_lock(&data->update_lock); |
529 | 530 | ||
530 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) | 531 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) |
531 | || !data->valid) { | 532 | || !data->valid) { |
@@ -586,7 +587,7 @@ static struct gl518_data *gl518_update_device(struct device *dev) | |||
586 | data->valid = 1; | 587 | data->valid = 1; |
587 | } | 588 | } |
588 | 589 | ||
589 | up(&data->update_lock); | 590 | mutex_unlock(&data->update_lock); |
590 | 591 | ||
591 | return data; | 592 | return data; |
592 | } | 593 | } |