diff options
Diffstat (limited to 'drivers/hwmon/lm80.c')
| -rw-r--r-- | drivers/hwmon/lm80.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c index c9a7cdea7bd7..f72120d08c4c 100644 --- a/drivers/hwmon/lm80.c +++ b/drivers/hwmon/lm80.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
| 29 | #include <linux/hwmon.h> | 29 | #include <linux/hwmon.h> |
| 30 | #include <linux/err.h> | 30 | #include <linux/err.h> |
| 31 | #include <linux/mutex.h> | ||
| 31 | 32 | ||
| 32 | /* Addresses to scan */ | 33 | /* Addresses to scan */ |
| 33 | static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, | 34 | static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, |
| @@ -108,7 +109,7 @@ static inline long TEMP_FROM_REG(u16 temp) | |||
| 108 | struct lm80_data { | 109 | struct lm80_data { |
| 109 | struct i2c_client client; | 110 | struct i2c_client client; |
| 110 | struct class_device *class_dev; | 111 | struct class_device *class_dev; |
| 111 | struct semaphore update_lock; | 112 | struct mutex update_lock; |
| 112 | char valid; /* !=0 if following fields are valid */ | 113 | char valid; /* !=0 if following fields are valid */ |
| 113 | unsigned long last_updated; /* In jiffies */ | 114 | unsigned long last_updated; /* In jiffies */ |
| 114 | 115 | ||
| @@ -191,10 +192,10 @@ static ssize_t set_in_##suffix(struct device *dev, struct device_attribute *attr | |||
| 191 | struct lm80_data *data = i2c_get_clientdata(client); \ | 192 | struct lm80_data *data = i2c_get_clientdata(client); \ |
| 192 | long val = simple_strtol(buf, NULL, 10); \ | 193 | long val = simple_strtol(buf, NULL, 10); \ |
| 193 | \ | 194 | \ |
| 194 | down(&data->update_lock);\ | 195 | mutex_lock(&data->update_lock);\ |
| 195 | data->value = IN_TO_REG(val); \ | 196 | data->value = IN_TO_REG(val); \ |
| 196 | lm80_write_value(client, reg, data->value); \ | 197 | lm80_write_value(client, reg, data->value); \ |
| 197 | up(&data->update_lock);\ | 198 | mutex_unlock(&data->update_lock);\ |
| 198 | return count; \ | 199 | return count; \ |
| 199 | } | 200 | } |
| 200 | set_in(min0, in_min[0], LM80_REG_IN_MIN(0)); | 201 | set_in(min0, in_min[0], LM80_REG_IN_MIN(0)); |
| @@ -241,10 +242,10 @@ static ssize_t set_fan_##suffix(struct device *dev, struct device_attribute *att | |||
| 241 | struct lm80_data *data = i2c_get_clientdata(client); \ | 242 | struct lm80_data *data = i2c_get_clientdata(client); \ |
| 242 | long val = simple_strtoul(buf, NULL, 10); \ | 243 | long val = simple_strtoul(buf, NULL, 10); \ |
| 243 | \ | 244 | \ |
| 244 | down(&data->update_lock);\ | 245 | mutex_lock(&data->update_lock);\ |
| 245 | data->value = FAN_TO_REG(val, DIV_FROM_REG(data->div)); \ | 246 | data->value = FAN_TO_REG(val, DIV_FROM_REG(data->div)); \ |
| 246 | lm80_write_value(client, reg, data->value); \ | 247 | lm80_write_value(client, reg, data->value); \ |
| 247 | up(&data->update_lock);\ | 248 | mutex_unlock(&data->update_lock);\ |
| 248 | return count; \ | 249 | return count; \ |
| 249 | } | 250 | } |
| 250 | set_fan(min1, fan_min[0], LM80_REG_FAN_MIN(1), fan_div[0]); | 251 | set_fan(min1, fan_min[0], LM80_REG_FAN_MIN(1), fan_div[0]); |
| @@ -263,7 +264,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
| 263 | u8 reg; | 264 | u8 reg; |
| 264 | 265 | ||
| 265 | /* Save fan_min */ | 266 | /* Save fan_min */ |
| 266 | down(&data->update_lock); | 267 | mutex_lock(&data->update_lock); |
| 267 | min = FAN_FROM_REG(data->fan_min[nr], | 268 | min = FAN_FROM_REG(data->fan_min[nr], |
| 268 | DIV_FROM_REG(data->fan_div[nr])); | 269 | DIV_FROM_REG(data->fan_div[nr])); |
| 269 | 270 | ||
| @@ -275,7 +276,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
| 275 | default: | 276 | default: |
| 276 | dev_err(&client->dev, "fan_div value %ld not " | 277 | dev_err(&client->dev, "fan_div value %ld not " |
| 277 | "supported. Choose one of 1, 2, 4 or 8!\n", val); | 278 | "supported. Choose one of 1, 2, 4 or 8!\n", val); |
| 278 | up(&data->update_lock); | 279 | mutex_unlock(&data->update_lock); |
| 279 | return -EINVAL; | 280 | return -EINVAL; |
| 280 | } | 281 | } |
| 281 | 282 | ||
| @@ -286,7 +287,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
| 286 | /* Restore fan_min */ | 287 | /* Restore fan_min */ |
| 287 | data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); | 288 | data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); |
| 288 | lm80_write_value(client, LM80_REG_FAN_MIN(nr + 1), data->fan_min[nr]); | 289 | lm80_write_value(client, LM80_REG_FAN_MIN(nr + 1), data->fan_min[nr]); |
| 289 | up(&data->update_lock); | 290 | mutex_unlock(&data->update_lock); |
| 290 | 291 | ||
| 291 | return count; | 292 | return count; |
| 292 | } | 293 | } |
| @@ -325,10 +326,10 @@ static ssize_t set_temp_##suffix(struct device *dev, struct device_attribute *at | |||
| 325 | struct lm80_data *data = i2c_get_clientdata(client); \ | 326 | struct lm80_data *data = i2c_get_clientdata(client); \ |
| 326 | long val = simple_strtoul(buf, NULL, 10); \ | 327 | long val = simple_strtoul(buf, NULL, 10); \ |
| 327 | \ | 328 | \ |
| 328 | down(&data->update_lock); \ | 329 | mutex_lock(&data->update_lock); \ |
| 329 | data->value = TEMP_LIMIT_TO_REG(val); \ | 330 | data->value = TEMP_LIMIT_TO_REG(val); \ |
| 330 | lm80_write_value(client, reg, data->value); \ | 331 | lm80_write_value(client, reg, data->value); \ |
| 331 | up(&data->update_lock); \ | 332 | mutex_unlock(&data->update_lock); \ |
| 332 | return count; \ | 333 | return count; \ |
| 333 | } | 334 | } |
| 334 | set_temp(hot_max, temp_hot_max, LM80_REG_TEMP_HOT_MAX); | 335 | set_temp(hot_max, temp_hot_max, LM80_REG_TEMP_HOT_MAX); |
| @@ -437,7 +438,7 @@ static int lm80_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 437 | /* Fill in the remaining client fields and put it into the global list */ | 438 | /* Fill in the remaining client fields and put it into the global list */ |
| 438 | strlcpy(new_client->name, name, I2C_NAME_SIZE); | 439 | strlcpy(new_client->name, name, I2C_NAME_SIZE); |
| 439 | data->valid = 0; | 440 | data->valid = 0; |
| 440 | init_MUTEX(&data->update_lock); | 441 | mutex_init(&data->update_lock); |
| 441 | 442 | ||
| 442 | /* Tell the I2C layer a new client has arrived */ | 443 | /* Tell the I2C layer a new client has arrived */ |
| 443 | if ((err = i2c_attach_client(new_client))) | 444 | if ((err = i2c_attach_client(new_client))) |
| @@ -545,7 +546,7 @@ static struct lm80_data *lm80_update_device(struct device *dev) | |||
| 545 | struct lm80_data *data = i2c_get_clientdata(client); | 546 | struct lm80_data *data = i2c_get_clientdata(client); |
| 546 | int i; | 547 | int i; |
| 547 | 548 | ||
| 548 | down(&data->update_lock); | 549 | mutex_lock(&data->update_lock); |
| 549 | 550 | ||
| 550 | if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { | 551 | if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { |
| 551 | dev_dbg(&client->dev, "Starting lm80 update\n"); | 552 | dev_dbg(&client->dev, "Starting lm80 update\n"); |
| @@ -585,7 +586,7 @@ static struct lm80_data *lm80_update_device(struct device *dev) | |||
| 585 | data->valid = 1; | 586 | data->valid = 1; |
| 586 | } | 587 | } |
| 587 | 588 | ||
| 588 | up(&data->update_lock); | 589 | mutex_unlock(&data->update_lock); |
| 589 | 590 | ||
| 590 | return data; | 591 | return data; |
| 591 | } | 592 | } |
